• 【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 */
  • 相关阅读:
    axios 进行类库封装
    vue的中vuex为何需要mutation更新状态,vue-router的路由的理解
    发布订阅者模式、观察者模式总结
    es 模块的基础知识,深度了解
    绑定事件的模型
    rem+media+jquery布局结局方案
    VDOM总结
    react-redux
    发布网站配置文件和SSL
    css3d旋转
  • 原文地址:https://www.cnblogs.com/cuish/p/3677087.html
Copyright © 2020-2023  润新知