在C ++中重载全局new()调用之前未初始化全局静态变量

时间:2011-04-14 21:50:43

标签: c++

在一个项目中,我全局重载了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变量。

2 个答案:

答案 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