繁体   English   中英

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

[英]Global static variable not initialized before overloaded global new() call in C++

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

将其隐藏在函数中:

HeapManager& getHeapManager()
{
    static HeapManager single;
    return single;
}

// ...

void * operator new ( ... )
{
    void* p = getHeapmanager().AllocateFromHeap( size );
    ...

这样,只有在调用函数时才能创建它。

查看《 The Nifty Counter Trick》。 这就是使cout和cerr成为全局变量的技巧: http ://www.petebecker.com/js/js199905.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM