【Windows核心编程】重载类成员函数new / new[] / delete / delete[]
- // Heap.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <Windows.h>
- #include <iostream>
- #include <new>
- using namespace std;
- int* p = new int();
- class CSomeClass
- {
- protected:
- static size_t s_Counts;
- static HANDLE s_hHeap;
- public:
- CSomeClass();
- CSomeClass(int value);
- virtual ~CSomeClass();
- //重载的该运算符为该类的成员函数
- //所以 这里的size_t参数分配的字节数不必显示指定,该参数为sizeof(该类)
- void* operator new(size_t);
- //void* operator new(size_t, const char* fileName, int line);
- void* operator new[](size_t);
- void operator delete(void* p);
- void operator delete[](void* p);
- //void operator delete(void* p, const char* fileName, int line);
- int m_value;
- };
- size_t CSomeClass::s_Counts = ;
- HANDLE CSomeClass::s_hHeap = NULL;
- CSomeClass::CSomeClass(){}
- CSomeClass::CSomeClass(int value) : m_value(value){}
- CSomeClass::~CSomeClass(){}
- void* CSomeClass::operator new(size_t size)
- //void* CSomeClass::operator new(size_t size, const char* fileName, int line)
- {
- //cout<<endl<<fileName<<", line "<<line<<endl;
- //如果是第一个实例,则创建堆
- if (NULL == s_hHeap)
- {
- s_hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, , );
- if (NULL == s_hHeap)
- {
- return NULL;
- }
- }
- void* p = HeapAlloc(s_hHeap, HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, size);
- if (NULL != p)
- {
- ++s_Counts;
- }
- return p;
- }
- void* CSomeClass::operator new[](size_t size)
- {
- //size大小为 sizeof(CSomeClass) * 个数 + 额外信息的大小
- //注意,这里这种做法可能会有问题,只有当额外信息的大小 小于 对象大小时才合理!!!
- //nums为对象的个数
- size_t nums = size / sizeof(CSomeClass);
- //sizeOfExtra的大小为存储额外信息的空间大小
- size_t sizeOfExtra = size % sizeof(CSomeClass);
- if (NULL == s_hHeap)
- {
- s_hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, , );
- if (NULL == s_hHeap)
- {
- return NULL;
- }
- }
- void* p = HeapAlloc(s_hHeap, HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, size);
- if (NULL != p)
- {
- s_Counts += nums;
- }
- return p;
- }
- void CSomeClass::operator delete(void* p)
- //void CSomeClass::operator delete(void* p, const char* fileName, int line)
- {
- if (NULL == p || NULL == s_hHeap)
- {
- return;
- }
- BOOL bRet = HeapFree(s_hHeap, , p);
- if (FALSE != bRet)
- {
- if (--s_Counts == )
- {
- HeapDestroy(s_hHeap);
- //CloseHandle(s_hHeap); //保留这一行 有异常 invalid handle
- s_hHeap = NULL;
- }
- }
- }
- void CSomeClass::operator delete[](void* p)
- {
- if (NULL == p || NULL == s_hHeap)
- {
- return;
- }
- size_t size = HeapSize(s_hHeap, , p);
- size_t nums = size / sizeof(CSomeClass);
- size_t sizeOfExtra = size % sizeof(CSomeClass);
- BOOL bRet = HeapFree(s_hHeap, , p);
- if (FALSE != bRet)
- {
- if ( == (s_Counts -= nums))
- {
- HeapDestroy(s_hHeap);
- s_hHeap = NULL;
- }
- }
- }
- #ifdef _DEBUG
- //#define new new(__FILE__, __LINE__)
- //#define delete delete(__FILE__, __LINE__)
- #endif
- int __cdecl _tmain(int argc, _TCHAR* argv[], _TCHAR* env[])
- {
- HANDLE hHeaps[] = {NULL};
- DWORD dwHeaps = GetProcessHeaps(sizeof(hHeaps) / sizeof(hHeaps[]), hHeaps);
- CSomeClass* pAddr2 = new CSomeClass[]();
- dwHeaps = GetProcessHeaps(sizeof(hHeaps) / sizeof(hHeaps[]), hHeaps);
- delete[] pAddr2;
- dwHeaps = GetProcessHeaps(sizeof(hHeaps) / sizeof(hHeaps[]), hHeaps);
- #pragma region 测试1
- int size = sizeof(CSomeClass);
- cout<<"sizeof(CSomeClass) is "<<size<<endl;
- CSomeClass* pObj = new CSomeClass(size * );
- pObj->m_value = ;
- CSomeClass* pObj2 = new CSomeClass();
- pObj2->m_value = ;
- delete pObj;
- //delete pObj2;
- #pragma endregion
- CSomeClass* pArr = new CSomeClass[];
- //UINT HeapCompact(HANDLE hHeap, DWORD fdwFlags)
- //BOOL HeapLock(HANDLE hHeap);
- //BOOL HeapUnLock(HANDLE hHeap);
- //BOOL HeapWalk(HANDLE hHEap, PROCESS_HEAP_ENTRY pHeapEntry)
- /*
- BOOL bRet = FALSE;
- PROCESS_HEAP_ENTRY phe;
- phe.lpData = NULL;
- HeapLock(hHeap);
- while(TRUE == (bRet = HeapWalk(hHeap, 0, &phe))
- {
- //do something
- phe.lpData = NULL;
- }
- HeapUnLock(hHeap);
- */
- return ;
- }
- /*
- int _tmain(int argc, _TCHAR* argv[])
- {
- HANDLE hHeap = HeapCreate(HEAP_GENERATE_EXCEPTIONS, 0, 0);
- if (NULL == hHeap)
- {
- cerr<<"Create heap error \n";
- return -1;
- }
- //BOOL bRet = HeapSetInformation(hHeap, HeapEnableTerminationOnCorruption, NULL, 0);
- ULONG HeapInformationValue = 2;
- BOOL bRet = HeapSetInformation(
- hHeap, HeapCompatibilityInformation, &HeapInformationValue, sizeof(HeapInformationValue));
- size_t size = 100;
- PVOID pAddr = HeapAlloc(hHeap, HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, size);
- if(NULL == pAddr)
- {
- HeapFree(hHeap, 0, pAddr); //释放申请的内存快
- HeapDestroy(hHeap); //销毁堆
- CloseHandle(hHeap); //关闭句柄
- cerr<<"HeapAlloc error \n";
- return -2;
- }
- *((int*)(pAddr)) = 100;
- cout<<"int pAddr is "<<*((int*)(pAddr))<<endl;
- cout<<"alloc size of heap is "<<HeapSize(hHeap, 0, pAddr)<<endl;
- PVOID pAddr2 = HeapReAlloc(hHeap, HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY | HEAP_REALLOC_IN_PLACE_ONLY,
- pAddr, size * 20);
- if (NULL == pAddr2)
- {
- HeapFree(hHeap, 0, pAddr);
- HeapDestroy(hHeap);
- CloseHandle(hHeap);
- cerr<<"HeapReAlloc error \n";
- return -3;
- }
- cout<<"int pAddr2 is "<<*((int*)(pAddr2) + 1)<<endl;
- cout<<"Realloc size of heap is "<<HeapSize(hHeap, 0, pAddr2)<<endl;
- HeapFree(hHeap, 0, pAddr2);
- HeapDestroy(hHeap);
- CloseHandle(hHeap);
- cout<<"Heap opera is finish "<<endl;
- return 0;
- }
- */
【Windows核心编程】重载类成员函数new / new[] / delete / delete[]的更多相关文章
- 重载运算符:类成员函数or友元函数
类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...
- C++类成员函数的重载、覆盖和隐藏区别?
C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...
- C++类成员函数的 重载、覆盖和隐藏区别
重载:成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. #include <iostream> u ...
- C++:类成员函数的重载、覆盖和隐藏区别?
#include <iostream> class A { public: void func() { std::cout << "Hello" <& ...
- 并发编程: c++11 thread(Func, Args...)利用类成员函数创建线程
c++11是VS2012后支持的新标准,为并发编程提供了方便的std::thread. 使用示例: #include <thread> void thread_func(int arg1, ...
- 【非原创】C++类成员函数的重载、覆盖和隐藏
链接:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95来源:牛客网 题目:类成员函数的重载.覆盖和隐 ...
- c++类成员函数重载常量与非常量版本时避免代码重复的一种方法
c++有时候需要为类的某个成员函数重载常量与非常量的版本,定义常量版本是为了保证该函数可作用于常量类对象上,并防止函数改动对象内容.但有时两个版本的函数仅仅是在返回的类型不同,而在返回前做了大量相同的 ...
- 类成员函数的重载、覆盖和隐藏区别 (C++)(转)
类成员函数的重载.覆盖和隐藏区别 (C++) 这是本人第一次写博客,主要是想记录自己的学习过程.心得体会,一是可以方便以后回顾相关知识,二是可以与大家相互学习交流. 关于C++中类成员函数的重载. ...
- python2学习------基础语法3(类、类的继承、类成员函数、防御式编程)
1.类的定义以及实例化 # 类定义 class p: """ this is a basic class """ basicInfo={&q ...
随机推荐
- floodlight 中两个互相矛盾的地方
floodlight中,添加防火墙规则,0表示最高优先级,数字越大,优先级越低;但是在StaticFlowPusher中写flow的时候,0表示最低优先级,数字越大,优先级越高,32767为最高. f ...
- Mac 如果一定要写个锁屏程序的话就这样
package test; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import ...
- Linux之SAMBA共享服务
简述 Samba服务器可以让Windows操作系统用户访问局域网中Linux主机,就象访问网上邻居一样方便. 具有以下功能: 共享目录:在局域网上共享某个或某些目录,使得同一个网络内的Windows用 ...
- 88. Merge Sorted Array
题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume ...
- 在Eclipse下debug 出现Source not found for ...
在Eclipse下debug 出现Source not found for ... 在Eclipse下调试Servlet出现了Source not found for XxxAction.execut ...
- 机器学习 —— 概率图模型(推理:MAP)
MAP 是最大后验概率的缩写.后验概率指的是当有一定观测结果的情况下,对其他随机变量进行推理.假设随机变量的集合为X ,观察到的变量为 e, W = X-e , AP = P(W|e). 后验概率和联 ...
- Android如何获取开机启动项列表
static final String BOOT_START_PERMISSION = "android.permission.RECEIVE_BOOT_COMPLETED"; p ...
- Java API —— List接口&ListIterator接口
1.List接口概述 有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索 ...
- Case Study: Random Number Generation(翻译教材)
很荣幸,经过三天的努力.终于把自己翻译的教材做完了,现在把它贴出来,希望能指出其中的不足. Case Study: Random Number Generation Fig. 6.7 C++ 标 ...
- DataGridView控件的使用---添加行
最简单的方法 可以静态绑定数据源,这样就自动为DataGridView控件添加相应的行. 假如需要动态为DataGridView控件添加新行,方法有很多种,下面简单介绍如何为DataGridView控 ...