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