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

【Windows核心编程】重载类成员函数new / new[] / delete / delete[]的更多相关文章

  1. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...

  2. C++类成员函数的重载、覆盖和隐藏区别?

    C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...

  3. C++类成员函数的 重载、覆盖和隐藏区别

    重载:成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. #include <iostream> u ...

  4. C++:类成员函数的重载、覆盖和隐藏区别?

    #include <iostream> class A { public: void func() { std::cout << "Hello" <& ...

  5. 并发编程: c++11 thread(Func, Args...)利用类成员函数创建线程

    c++11是VS2012后支持的新标准,为并发编程提供了方便的std::thread. 使用示例: #include <thread> void thread_func(int arg1, ...

  6. 【非原创】C++类成员函数的重载、覆盖和隐藏

    链接:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95来源:牛客网 题目:类成员函数的重载.覆盖和隐 ...

  7. c++类成员函数重载常量与非常量版本时避免代码重复的一种方法

    c++有时候需要为类的某个成员函数重载常量与非常量的版本,定义常量版本是为了保证该函数可作用于常量类对象上,并防止函数改动对象内容.但有时两个版本的函数仅仅是在返回的类型不同,而在返回前做了大量相同的 ...

  8. 类成员函数的重载、覆盖和隐藏区别 (C++)(转)

    类成员函数的重载.覆盖和隐藏区别 (C++)   这是本人第一次写博客,主要是想记录自己的学习过程.心得体会,一是可以方便以后回顾相关知识,二是可以与大家相互学习交流. 关于C++中类成员函数的重载. ...

  9. python2学习------基础语法3(类、类的继承、类成员函数、防御式编程)

    1.类的定义以及实例化 # 类定义 class p: """ this is a basic class """ basicInfo={&q ...

随机推荐

  1. floodlight 中两个互相矛盾的地方

    floodlight中,添加防火墙规则,0表示最高优先级,数字越大,优先级越低;但是在StaticFlowPusher中写flow的时候,0表示最低优先级,数字越大,优先级越高,32767为最高. f ...

  2. Mac 如果一定要写个锁屏程序的话就这样

    package test; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import ...

  3. Linux之SAMBA共享服务

    简述 Samba服务器可以让Windows操作系统用户访问局域网中Linux主机,就象访问网上邻居一样方便. 具有以下功能: 共享目录:在局域网上共享某个或某些目录,使得同一个网络内的Windows用 ...

  4. 88. Merge Sorted Array

    题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume ...

  5. 在Eclipse下debug 出现Source not found for ...

    在Eclipse下debug 出现Source not found for ... 在Eclipse下调试Servlet出现了Source not found for XxxAction.execut ...

  6. 机器学习 —— 概率图模型(推理:MAP)

    MAP 是最大后验概率的缩写.后验概率指的是当有一定观测结果的情况下,对其他随机变量进行推理.假设随机变量的集合为X ,观察到的变量为 e, W = X-e , AP = P(W|e). 后验概率和联 ...

  7. Android如何获取开机启动项列表

    static final String BOOT_START_PERMISSION = "android.permission.RECEIVE_BOOT_COMPLETED"; p ...

  8. Java API —— List接口&ListIterator接口

    1.List接口概述         有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索 ...

  9. Case Study: Random Number Generation(翻译教材)

    很荣幸,经过三天的努力.终于把自己翻译的教材做完了,现在把它贴出来,希望能指出其中的不足.   Case Study: Random Number Generation Fig. 6.7  C++ 标 ...

  10. DataGridView控件的使用---添加行

    最简单的方法 可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行. 假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控 ...