// NewHandler.cpp | |
#include "StdAfx.h" | |
#include <stdlib.h> | |
#include "NewHandler.h" | |
// #define DEBUG_MEMORY_LEAK | |
#ifndef DEBUG_MEMORY_LEAK | |
#ifdef _WIN32 | |
/* | |
void * my_new(size_t size) | |
{ | |
// void *p = ::HeapAlloc(::GetProcessHeap(), 0, size); | |
void *p = ::malloc(size); | |
if (p == 0) | |
throw CNewException(); | |
return p; | |
} | |
void my_delete(void *p) throw() | |
{ | |
// if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p); | |
::free(p); | |
} | |
void * my_Realloc(void *p, size_t newSize, size_t oldSize) | |
{ | |
void *newBuf = my_new(newSize); | |
memcpy(newBuf, p, oldSize); | |
my_delete(p); | |
return newBuf; | |
} | |
*/ | |
void * | |
#ifdef _MSC_VER | |
__cdecl | |
#endif | |
operator new(size_t size) | |
{ | |
// void *p = ::HeapAlloc(::GetProcessHeap(), 0, size); | |
void *p = ::malloc(size); | |
if (p == 0) | |
throw CNewException(); | |
return p; | |
} | |
void | |
#ifdef _MSC_VER | |
__cdecl | |
#endif | |
operator delete(void *p) throw() | |
{ | |
// if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p); | |
::free(p); | |
} | |
/* | |
void * | |
#ifdef _MSC_VER | |
__cdecl | |
#endif | |
operator new[](size_t size) | |
{ | |
// void *p = ::HeapAlloc(::GetProcessHeap(), 0, size); | |
void *p = ::malloc(size); | |
if (p == 0) | |
throw CNewException(); | |
return p; | |
} | |
void | |
#ifdef _MSC_VER | |
__cdecl | |
#endif | |
operator delete[](void *p) throw() | |
{ | |
// if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p); | |
::free(p); | |
} | |
*/ | |
#endif | |
#else | |
#include <stdio.h> | |
// #pragma init_seg(lib) | |
const int kDebugSize = 1000000; | |
static void *a[kDebugSize]; | |
static int index = 0; | |
static int numAllocs = 0; | |
void * __cdecl operator new(size_t size) | |
{ | |
numAllocs++; | |
void *p = HeapAlloc(GetProcessHeap(), 0, size); | |
if (index < kDebugSize) | |
{ | |
a[index] = p; | |
index++; | |
} | |
if (p == 0) | |
throw CNewException(); | |
printf("Alloc %6d, size = %8d\n", numAllocs, size); | |
return p; | |
} | |
class CC | |
{ | |
public: | |
CC() | |
{ | |
for (int i = 0; i < kDebugSize; i++) | |
a[i] = 0; | |
} | |
~CC() | |
{ | |
for (int i = 0; i < kDebugSize; i++) | |
if (a[i] != 0) | |
return; | |
} | |
} g_CC; | |
void __cdecl operator delete(void *p) | |
{ | |
if (p == 0) | |
return; | |
/* | |
for (int i = 0; i < index; i++) | |
if (a[i] == p) | |
a[i] = 0; | |
*/ | |
HeapFree(GetProcessHeap(), 0, p); | |
numAllocs--; | |
printf("Free %d\n", numAllocs); | |
} | |
#endif | |
/* | |
int MemErrorVC(size_t) | |
{ | |
throw CNewException(); | |
// return 1; | |
} | |
CNewHandlerSetter::CNewHandlerSetter() | |
{ | |
// MemErrorOldVCFunction = _set_new_handler(MemErrorVC); | |
} | |
CNewHandlerSetter::~CNewHandlerSetter() | |
{ | |
// _set_new_handler(MemErrorOldVCFunction); | |
} | |
*/ |