![](/img/trans.png)
[英]Global static variable initialised with a call to static class function in c++
[英]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.