windows-nt/Source/XPSP1/NT/net/ias/inc/newop.cpp
2020-09-26 16:20:57 +08:00

87 lines
1.5 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1997, Microsoft Corp. All rights reserved.
//
// FILE
//
// newop.cpp
//
// SYNOPSIS
//
// Implmentation of the global new and delete operators.
//
// MODIFICATION HISTORY
//
// 08/19/1997 Original version.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _NEWOP_CPP_
#define _NEWOP_CPP_
#include <cstdlib>
#include <new>
//////////
// CRT function that calls the new handler directly.
//////////
extern "C" int __cdecl _callnewh(size_t);
//////////
// Standard new operator.
//////////
void* __cdecl operator new(size_t size) throw (std::bad_alloc)
{
void* p;
// Loop until either we get the memory or the new handler fails.
while ((p = malloc(size)) == 0)
{
if (!_callnewh(size))
{
throw std::bad_alloc();
}
}
return p;
}
//////////
// "No throw" version of the new operator.
//////////
void* __cdecl operator new(size_t size, const std::nothrow_t&) throw ()
{
void* p;
// Loop until either we get the memory or the new handler fails.
while ((p = malloc(size)) == 0)
{
if (!_callnewh(size))
{
return 0;
}
}
return p;
}
//////////
// Delete operator.
//////////
void __cdecl operator delete(void *p) throw()
{
#ifdef DEBUG
// Clobber the memory.
if (p) memset(p, 0xA3, _msize(p));
#endif
// The MSVC free() handles null pointers, so we don't have to check.
free(p);
}
#endif // _NEWOP_CPP_