Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中重载全局new()调用之前未初始化全局静态变量+;_C++ - Fatal编程技术网

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

C++ 在C+;中重载全局new()调用之前未初始化全局静态变量+;,c++,C++,在一个项目中,我全局重载了操作符new/delete,以利用私有堆。执行此操作的代码如下(在文件Allocator.cpp中): 目标是在加载文件时初始化heapManager,然后当有人调用new()时,将从heap中分配内存。此代码打包在dll中,由另一个exe使用 但我们发现,dll代码之外有人在调用new(),而heapManager为null。我们这样解决问题: HeapManager* pheapManager = NULL; void * operator new (si

在一个项目中,我全局重载了操作符new/delete,以利用私有堆。执行此操作的代码如下(在文件Allocator.cpp中):

目标是在加载文件时初始化heapManager,然后当有人调用new()时,将从heap中分配内存。此代码打包在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 );
    ...

这样,它将仅在调用函数时创建。

查看漂亮的计数器技巧。这就是制作cout和cerr全局变量的技巧:

当你说“heapManager为null”时,你的确切意思是什么?它不是指针…我的经验是,静态初始化在不同的编译器之间是不同的。我不得不使用的几个Borland/CodeGear编译器在这方面做得很糟糕。您的环境是什么?@Tobias Brick:NULL的意思是它的值为-heapManager{hHeap=0x00000000}要干净得多。我尝试了这种单例方法,但没有使用静态对象,而是使用了new()。。这导致了无限的递归。所以我放弃了。但使用静态对象解决了这个问题。我可能错了,但在阅读文档时,我觉得我的问题有点不同。我不需要在HeapManager的构造函数中初始化任何东西,我只想调用构造函数。我猜重载的新运算符的使用方式与普通函数不同。
HeapManager& getHeapManager()
{
    static HeapManager single;
    return single;
}

// ...

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