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