• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // NewHandler.cpp
2 
3 #include "StdAfx.h"
4 
5 #include <stdlib.h>
6 
7 #include "NewHandler.h"
8 
9 // #define DEBUG_MEMORY_LEAK
10 
11 #ifndef DEBUG_MEMORY_LEAK
12 
13 #ifdef _WIN32
14 void *
15 #ifdef _MSC_VER
16 __cdecl
17 #endif
operator new(size_t size)18 operator new(size_t size)
19 {
20   // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
21   void *p = ::malloc(size);
22   if (p == 0)
23     throw CNewException();
24   return p;
25 }
26 
27 void
28 #ifdef _MSC_VER
29 __cdecl
30 #endif
operator delete(void * p)31 operator delete(void *p) throw()
32 {
33   /*
34   if (p == 0)
35     return;
36   ::HeapFree(::GetProcessHeap(), 0, p);
37   */
38   ::free(p);
39 }
40 #endif
41 
42 #else
43 
44 #pragma init_seg(lib)
45 const int kDebugSize = 1000000;
46 static void *a[kDebugSize];
47 static int index = 0;
48 
49 static int numAllocs = 0;
operator new(size_t size)50 void * __cdecl operator new(size_t size)
51 {
52   numAllocs++;
53   void *p = HeapAlloc(GetProcessHeap(), 0, size);
54   if (index == 40)
55   {
56     int t = 1;
57   }
58   if (index < kDebugSize)
59   {
60     a[index] = p;
61     index++;
62   }
63   if (p == 0)
64     throw CNewException();
65   printf("Alloc %6d, size = %8d\n", numAllocs, size);
66   return p;
67 }
68 
69 class CC
70 {
71 public:
CC()72   CC()
73   {
74     for (int i = 0; i < kDebugSize; i++)
75       a[i] = 0;
76   }
~CC()77   ~CC()
78   {
79     for (int i = 0; i < kDebugSize; i++)
80       if (a[i] != 0)
81         return;
82   }
83 } g_CC;
84 
85 
operator delete(void * p)86 void __cdecl operator delete(void *p)
87 {
88   if (p == 0)
89     return;
90   /*
91   for (int i = 0; i < index; i++)
92     if (a[i] == p)
93       a[i] = 0;
94   */
95   HeapFree(GetProcessHeap(), 0, p);
96   numAllocs--;
97   printf("Free %d\n", numAllocs);
98 }
99 
100 #endif
101 
102 /*
103 int MemErrorVC(size_t)
104 {
105   throw CNewException();
106   // return 1;
107 }
108 CNewHandlerSetter::CNewHandlerSetter()
109 {
110   // MemErrorOldVCFunction = _set_new_handler(MemErrorVC);
111 }
112 CNewHandlerSetter::~CNewHandlerSetter()
113 {
114   // _set_new_handler(MemErrorOldVCFunction);
115 }
116 */
117