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