【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 ...
随机推荐
- 区间dp笔记√
区间DP是一类在区间上进行dp的最优问题,一般是根据问题设出一个表示状态的dp,可以是二维的也可以是三维的,一般情况下为二维. 然后将问题划分成两个子问题,也就是一段区间分成左右两个区间,然后将左右两 ...
- java代码实现自动登录功能
通常我们登录某网站,会有选择保存几天,或者是几个星期不用登录,之后输入该网站地址无需登录直接进入主页面,那么这就叫做自动登录,怎么实现呢,下面我以一个小例子来演示一下 登录页面:login.jsp & ...
- python mysql 简单总结(MySQLdb模块 需另外下载)
python 通过DB-API规范了它所支持的不同的数据库,使得不同的数据库可以使用统一的接口来访问和操作. 满足DB-API规范的的模块必须提供以下属性: 属性名 描述 apilevel DB-AP ...
- redhat 新装后不能联网
1.ifconfig查看是否有ip地址,如果没有就配置,命令如下: [root@redhat ~]# system-config-network 设置DHCP 为 [*] [ok]后,重新ifconf ...
- (转)最新版的SSH框整合(Spring 3.1.1 + Struts 2.3.1.2 + Hibernate 4.1)
最近一直有朋友在问,最新版的Spring.Struts.Hibernate整合老是有问题,昨晚大概看了一下.从Hibernate 4 开始,本身已经很好的实现了数据库事务模块,而Spring也把Hib ...
- Tomcat原理 分类: 原理 2015-06-28 19:26 5人阅读 评论(0) 收藏
Tomcat的模块结构设计的相当好,而且其Web 容器的性能相当出色.JBoss直接就使用了Tomcat的web容器,WebLogic的早期版本也是使用了Tomcat的代码. Web容器的工作过程在下 ...
- linux下拷贝整个目录
该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,就如同DOS下的copy命令一样,功能非常强大. 语法:cp [选项] 源文件或目录 目标文件或目录 说明:该命令把指定的源文件复制到目标文件或 ...
- CF 366E Dima and Magic Guitar(最远哈密顿距离)
题目链接:http://codeforces.com/problemset/problem/366/E 题意:给出一个n*m的数字矩阵A,每个矩阵元素的范围[1,K].给出一个长度为s的数字串B,B的 ...
- 1176. Hyperchannels(欧拉回路)
1176 给定一有向图 求其反图的欧拉回路 路径输反了 一直WA.. #include <iostream> #include<cstdio> #include<cstr ...
- bzoj2489
这种题完全可以暴力找规律,暴力打表各种搞法 这里有一篇比较全面的题解:http://acm.uestc.edu.cn/bbs/read.php?tid=3698&page=1&tore ...