【Windows核心编程】重载类成员函数new / new[] / delete / delete[]

  1 // Heap.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h" 
  5 #include <Windows.h>
  6 #include <iostream>
  7 #include <new>
  8 using namespace std;
  9 
 10 int* p = new int(10);
 11 
 12 
 13 class CSomeClass 
 14 {
 15 protected:
 16 static size_t s_Counts;
 17 static HANDLE s_hHeap;
 18 
 19 
 20 public:
 21 CSomeClass();
 22 CSomeClass(int value);
 23 virtual ~CSomeClass();
 24 
 25 //重载的该运算符为该类的成员函数
 26 //所以 这里的size_t参数分配的字节数不必显示指定,该参数为sizeof(该类)
 27 void* operator new(size_t);
 28 //void* operator new(size_t, const char* fileName, int line); 
 29 void* operator new[](size_t);
 30 
 31 void operator delete(void* p);
 32 void operator delete[](void* p);
 33 //void operator delete(void* p, const char* fileName, int line);
 34 
 35 
 36 int m_value;
 37 
 38 };
 39 
 40 size_t CSomeClass::s_Counts = 0;
 41 HANDLE CSomeClass::s_hHeap = NULL;
 42 CSomeClass::CSomeClass(){}
 43 
 44 CSomeClass::CSomeClass(int value) : m_value(value){}
 45 
 46 CSomeClass::~CSomeClass(){}
 47 
 48 void* CSomeClass::operator new(size_t size)
 49 //void* CSomeClass::operator new(size_t size, const char* fileName, int line)
 50 {
 51 //cout<<endl<<fileName<<", line "<<line<<endl;
 52 
 53 //如果是第一个实例,则创建堆
 54 if (NULL == s_hHeap)
 55 {
 56 s_hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0);
 57 if (NULL == s_hHeap)
 58 { 
 59 return NULL;
 60 }
 61 }
 62 
 63 void* p = HeapAlloc(s_hHeap, HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, size);
 64 if (NULL != p)
 65 {
 66 ++s_Counts;
 67 }
 68 
 69 return p;
 70 }
 71 
 72 void* CSomeClass::operator new[](size_t size)
 73 {
 74 //size大小为 sizeof(CSomeClass) * 个数 + 额外信息的大小
 75 
 76 //注意,这里这种做法可能会有问题,只有当额外信息的大小 小于 对象大小时才合理!!!
 77 
 78 //nums为对象的个数
 79 size_t nums = size / sizeof(CSomeClass);
 80 
 81 //sizeOfExtra的大小为存储额外信息的空间大小
 82 size_t sizeOfExtra = size % sizeof(CSomeClass);
 83 
 84 if (NULL == s_hHeap)
 85 {
 86 s_hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0);
 87 if (NULL == s_hHeap)
 88 {
 89 return NULL;
 90 }
 91 }
 92 
 93 void* p = HeapAlloc(s_hHeap, HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, size);
 94 if (NULL != p)
 95 {
 96 s_Counts += nums;
 97 }
 98 
 99 return p;
100 }
101 
102 
103 void CSomeClass::operator delete(void* p) 
104 //void CSomeClass::operator delete(void* p, const char* fileName, int line)
105 { 
106 if (NULL == p || NULL == s_hHeap)
107 {
108 return;
109 }
110 
111 BOOL bRet = HeapFree(s_hHeap, 0, p);
112 if (FALSE != bRet)
113 { 
114 if (--s_Counts == 0)
115 {
116 HeapDestroy(s_hHeap);
117 //CloseHandle(s_hHeap); //保留这一行 有异常 invalid handle
118 s_hHeap = NULL;
119 }
120 } 
121 }
122 
123 void CSomeClass::operator delete[](void* p)
124 {
125 if (NULL == p || NULL == s_hHeap)
126 {
127 return;
128 }
129 
130 size_t size = HeapSize(s_hHeap, 0, p);
131 size_t nums = size / sizeof(CSomeClass);
132 size_t sizeOfExtra = size % sizeof(CSomeClass);
133 
134 BOOL bRet = HeapFree(s_hHeap, 0, p);
135 if (FALSE != bRet)
136 {
137 if (0 == (s_Counts -= nums))
138 {
139 HeapDestroy(s_hHeap);
140 s_hHeap = NULL;
141 }
142 } 
143 }
144 
145 
146 #ifdef _DEBUG
147 //#define new new(__FILE__, __LINE__)
148 //#define delete delete(__FILE__, __LINE__)
149 #endif
150 
151  
152 
153 int __cdecl _tmain(int argc, _TCHAR* argv[], _TCHAR* env[])
154 {
155 HANDLE hHeaps[25] = {NULL};
156 DWORD dwHeaps = GetProcessHeaps(sizeof(hHeaps) / sizeof(hHeaps[0]), hHeaps);
157 
158 CSomeClass* pAddr2 = new CSomeClass[10]();
159 dwHeaps = GetProcessHeaps(sizeof(hHeaps) / sizeof(hHeaps[0]), hHeaps);
160 delete[] pAddr2;
161 dwHeaps = GetProcessHeaps(sizeof(hHeaps) / sizeof(hHeaps[0]), hHeaps);
162 
163 #pragma region 测试1
164 int size = sizeof(CSomeClass);
165 cout<<"sizeof(CSomeClass) is "<<size<<endl;
166 
167 CSomeClass* pObj = new CSomeClass(size * 2);
168 pObj->m_value = 100; 
169 CSomeClass* pObj2 = new CSomeClass();
170 pObj2->m_value = 200;
171 
172 delete pObj;
173 //delete pObj2; 
174 #pragma endregion
175 
176 
177 CSomeClass* pArr = new CSomeClass[10];
178 
179 
180 //UINT HeapCompact(HANDLE hHeap, DWORD fdwFlags)
181 //BOOL HeapLock(HANDLE hHeap);
182 //BOOL HeapUnLock(HANDLE hHeap);
183 //BOOL HeapWalk(HANDLE hHEap, PROCESS_HEAP_ENTRY pHeapEntry)
184 /*
185 BOOL bRet = FALSE;
186 PROCESS_HEAP_ENTRY phe;
187 phe.lpData = NULL;
188 
189 HeapLock(hHeap);
190 while(TRUE == (bRet = HeapWalk(hHeap, 0, &phe))
191 {
192 //do something
193 phe.lpData = NULL;
194 }
195 
196 HeapUnLock(hHeap);
197 
198 */
199 
200  
201 
202 
203 return 0;
204 }
205 
206 
207 /*
208 int _tmain(int argc, _TCHAR* argv[])
209 {
210 HANDLE hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0);
211 if (NULL == hHeap)
212 {
213 cerr<<"Create heap error 
";
214 return -1;
215 }
216 
217 //BOOL bRet = HeapSetInformation(hHeap, HeapEnableTerminationOnCorruption, NULL, 0);
218 
219 ULONG HeapInformationValue = 2; 
220 BOOL bRet = HeapSetInformation(
221 hHeap, HeapCompatibilityInformation, &HeapInformationValue, sizeof(HeapInformationValue));
222 
223 
224 size_t size = 100;
225 PVOID pAddr = HeapAlloc(hHeap, HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, size);
226 if(NULL == pAddr)
227 {
228 HeapFree(hHeap, 0, pAddr); //释放申请的内存快
229 HeapDestroy(hHeap); //销毁堆
230 CloseHandle(hHeap); //关闭句柄
231 cerr<<"HeapAlloc error 
";
232 return -2;
233 }
234 
235 *((int*)(pAddr)) = 100;
236 cout<<"int pAddr is "<<*((int*)(pAddr))<<endl;
237 
238 cout<<"alloc size of heap is "<<HeapSize(hHeap, 0, pAddr)<<endl;
239 
240 PVOID pAddr2 = HeapReAlloc(hHeap, HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY | HEAP_REALLOC_IN_PLACE_ONLY,
241 pAddr, size * 20);
242 if (NULL == pAddr2)
243 {
244 HeapFree(hHeap, 0, pAddr);
245 HeapDestroy(hHeap);
246 CloseHandle(hHeap);
247 cerr<<"HeapReAlloc error 
";
248 
249 return -3;
250 }
251 cout<<"int pAddr2 is "<<*((int*)(pAddr2) + 1)<<endl;
252 
253 cout<<"Realloc size of heap is "<<HeapSize(hHeap, 0, pAddr2)<<endl;
254 
255 HeapFree(hHeap, 0, pAddr2);
256 HeapDestroy(hHeap); 
257 CloseHandle(hHeap);
258 cout<<"Heap opera is finish "<<endl;
259 
260 
261 return 0;
262 }
263 
264 */
原文地址:https://www.cnblogs.com/cuish/p/3677087.html