为什么要创建自己的堆呢?有多方面原因:
- 对组件进行保护
- 更有效的内存管理
- 局部访问
- 避免线程同步开销
- 快速释放
在C++中,我们用new操作符来分配类对象,用delete操作符来释放它。
通过对C++类的new和delete操作符进行重载,我们可以非常容易地将堆函数加以运用。
总体来看,不为每一个类创建堆的唯一优势是不会有额外的性能和内存开销。但是这些性能和内存开销并不大,与潜在的回报相比,这很可能是值得的。
一种折中的方案是让每个类使用自己的堆,让派生类和基类共享同一个堆。
下面是为类写自己堆得一些标准实现:
//头文件
class CSomeClass
{
private:
static HANDLE s_hHeap;
static UINT s_uNum;
public:
void * operator new (size_t size);
void operator delete (void * p);
//其它成员函数和变量...
};
//源文件
HANDLE CSomeClass::s_hHeap= NULL;
UINT CSomeClass::s_uNum = 0;
void * CSomeClass::operator new (size_t size)
{
if(NULL == s_hHeap)
{
//首次为类创建自己的堆
s_hHeap = HeapCreate(HEAP_NO_SERIALIZE,0,0);
if(NULL == s_hHeap)
return NULL;
}
//在堆上分配内存
void *p = HeapAlloc(s_hHeap, 0, size);
if(NULL == p)
++s_uNum;
return p;
}
void CSomeClass::operator delete (void * p)
{
//释放堆上内存
if(HeapFree(s_hHeap, 0, p))
--s_uNum;
//如果堆为空时,销毁堆
if(0 == s_uNum)
if(HeapDestroy(s_hHeap))
s_hHeap = NULL;
}