在一个项目中,我全局重载了operator new / delete以使用私有堆。执行此操作的代码(在文件Allocator.cpp中):
static HeapManager heapManager;
void * operator new (size_t size)
{
void * p = heapManager.AllocateFromHeap(size);
if (p == 0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
目标是在加载文件时初始化heapManager,然后当有人调用new()时,将从堆中分配内存。此代码打包在一个DLL中,并由另一个exe使用。
但是我们发现我们的dll代码之外的人正在调用new()而heapManager是null。我们解决了这个问题:
HeapManager* pheapManager = NULL;
void * operator new (size_t size)
{
static HeapManager heapManager;
if (pheapManager == NULL)
{
pheapManager = &heapManager;
}
void * p = pheapManager->AllocateFromHeap(size);
if (p == 0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
但是他看起来很难看。有没有更好的方法来解决这个问题?我想要的是确保在调用new()之前初始化静态HeapManager变量。
答案 0 :(得分:2)
将其隐藏在一个函数中:
HeapManager& getHeapManager()
{
static HeapManager single;
return single;
}
// ...
void * operator new ( ... )
{
void* p = getHeapmanager().AllocateFromHeap( size );
...
这种方式只有在调用函数时才会创建。
答案 1 :(得分:2)
查看The Nifty Counter Trick。这是用于制作cout和cerr全局变量的技巧:http://www.petebecker.com/js/js199905.html