【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 ...
随机推荐
- *[codility]Country network
https://codility.com/programmers/challenges/fluorum2014 http://www.51nod.com/onlineJudge/questionCod ...
- *[topcoder]LCMSetEasy
http://community.topcoder.com/stat?c=problem_statement&pm=13040 DFS集合全排列+LCM和GCD.但事实上,有更简单的算法,列在 ...
- JAVA:23种设计模式详解(转)
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- idea15 如何设置代码不自动折叠
IDEA默认情况下,如果方法体中只有一行,这个方法体会折叠起来,就像这种
- Linux命令学习笔记(1)
groupadd 1.作用 groupadd命令用于将新组加入系统.2.格式groupadd [-g gid] [-o]] [-r] [-f] groupname3.主要参数-g gid:指定组ID号 ...
- Hibernate+JPA (EntityMange讲解)
近年来ORM(Object-Relational Mapping)对象关系映射,即实体对象和数据库表的映射)技术市场人声音鼎沸,异常热闹, Sun在充分吸收现有的优秀ORM框架设计思想的基础上,制定了 ...
- HDU 1255 覆盖的面积 (扫描线 线段树 离散化 矩形面积并)
题目链接 题意:中文题意. 分析:纯手敲,与上一道题目很相似,但是刚开始我以为只是把cnt>=0改成cnt>=2就行了,. 但是后来发现当当前加入的线段的范围之前 还有线段的时候就不行了, ...
- AWS 之 S3篇<.NET(c#)批量上传文件>
第一次知道AWS然后网上就研究了一番,如果也是第一次知道这个的话,或者对这个只知道是干什么,并没有写个相关的程序的话,可以看看这个网址http://docs.aws.amazon.com/zh_cn/ ...
- bzoj2431: [HAOI2009]逆序对数列
dp. f[i][j]表示放置第i个数有j个逆序对的方案数. s[i][j]维护前缀和(f[i][0]~f[i][j]). 状态转移方程 f[i][j]=s[i-1][j]-s[i-1][max(j- ...
- UVa 11722 (概率 数形结合) Joining with Friend
高中也做个这种类似的题目,概率空间是[t1, t2] × [s1, s2]的矩形,设x.y分别代表两辆列车到达的时间,则两人相遇的条件就是|x - y| <= w 从图形上看就是矩形夹在两条平行 ...