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
15 /*
16 void * my_new(size_t size)
17 {
18 // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
19 void *p = ::malloc(size);
20 if (p == 0)
21 throw CNewException();
22 return p;
23 }
24
25 void my_delete(void *p) throw()
26 {
27 // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);
28 ::free(p);
29 }
30
31 void * my_Realloc(void *p, size_t newSize, size_t oldSize)
32 {
33 void *newBuf = my_new(newSize);
34 memcpy(newBuf, p, oldSize);
35 my_delete(p);
36 return newBuf;
37 }
38 */
39
40 void *
41 #ifdef _MSC_VER
42 __cdecl
43 #endif
operator new(size_t size)44 operator new(size_t size)
45 {
46 // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
47 void *p = ::malloc(size);
48 if (p == 0)
49 throw CNewException();
50 return p;
51 }
52
53 void
54 #ifdef _MSC_VER
55 __cdecl
56 #endif
operator delete(void * p)57 operator delete(void *p) throw()
58 {
59 // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);
60 ::free(p);
61 }
62
63 /*
64 void *
65 #ifdef _MSC_VER
66 __cdecl
67 #endif
68 operator new[](size_t size)
69 {
70 // void *p = ::HeapAlloc(::GetProcessHeap(), 0, size);
71 void *p = ::malloc(size);
72 if (p == 0)
73 throw CNewException();
74 return p;
75 }
76
77 void
78 #ifdef _MSC_VER
79 __cdecl
80 #endif
81 operator delete[](void *p) throw()
82 {
83 // if (p == 0) return; ::HeapFree(::GetProcessHeap(), 0, p);
84 ::free(p);
85 }
86 */
87
88 #endif
89
90 #else
91
92 #include <stdio.h>
93
94 // #pragma init_seg(lib)
95 const int kDebugSize = 1000000;
96 static void *a[kDebugSize];
97 static int index = 0;
98
99 static int numAllocs = 0;
operator new(size_t size)100 void * __cdecl operator new(size_t size)
101 {
102 numAllocs++;
103 void *p = HeapAlloc(GetProcessHeap(), 0, size);
104 if (index < kDebugSize)
105 {
106 a[index] = p;
107 index++;
108 }
109 if (p == 0)
110 throw CNewException();
111 printf("Alloc %6d, size = %8d\n", numAllocs, size);
112 return p;
113 }
114
115 class CC
116 {
117 public:
CC()118 CC()
119 {
120 for (int i = 0; i < kDebugSize; i++)
121 a[i] = 0;
122 }
~CC()123 ~CC()
124 {
125 for (int i = 0; i < kDebugSize; i++)
126 if (a[i] != 0)
127 return;
128 }
129 } g_CC;
130
131
operator delete(void * p)132 void __cdecl operator delete(void *p)
133 {
134 if (p == 0)
135 return;
136 /*
137 for (int i = 0; i < index; i++)
138 if (a[i] == p)
139 a[i] = 0;
140 */
141 HeapFree(GetProcessHeap(), 0, p);
142 numAllocs--;
143 printf("Free %d\n", numAllocs);
144 }
145
146 #endif
147
148 /*
149 int MemErrorVC(size_t)
150 {
151 throw CNewException();
152 // return 1;
153 }
154 CNewHandlerSetter::CNewHandlerSetter()
155 {
156 // MemErrorOldVCFunction = _set_new_handler(MemErrorVC);
157 }
158 CNewHandlerSetter::~CNewHandlerSetter()
159 {
160 // _set_new_handler(MemErrorOldVCFunction);
161 }
162 */
163