1)我的项目中有一些静态类,可以在其构造函数中分配变量。
class StaticClass
{
public:
char *var;
StaticClass()
{
var=new char[100];
}
};
static StaticClass staticClass;
2)我已经覆盖了新的和删除操作员,并使他们跟踪std :: unordered_map
中的所有当前分配unordered_map<void*,size_t> allocations;
void* operator new[](size_t size)
{
void *p=malloc(size);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
allocations[p]=size;
return p;
}
当我的程序启动时,staticClass的构造函数在分配的构造函数为之前,因此new()试图在初始化之前将大小插入分配中,这是错误的。
。以前,当我遇到静态构造顺序的问题时,我只是将std ::映射放入零指针中,然后在第一次使用时将其初始化,以确保它在我第一次我第一次有效插入它:
unsorted_map<void*,size_t> *allocations=NULL;
//in code called by static constructor:
if(allocations==NULL)
allocations=new unsortedmap()
//now safe to insert into allocations
但是,这将不再起作用,因为我会在操作员new()中调用新的新(创建无限递归循环)。
我知道,我可能可以通过制作另一个特殊版本的操作员新的新版本来解决此问题,该版本需要一些令牌参数来区分它,并将其用来初始化分配,但是从更一般的(学习)意义上讲,我更喜欢以某种方式
a)在静态频道(best)
之前要初始化的强制分配b)有某种方式将默认运营商称为新的,而不是我的覆盖(我认为这是不可能的,但是...)
)c)其他一些更通用的解决方案?
避免初始化顺序问题的一种简单方法是将静态对象包裹在功能中:
unordered_map<void*,size_t> &allocations()
{
static unordered_map<void*,size_t> static_map;
return static_map;
}
然后这样使用:
void* operator new[](size_t size)
{
void *p=malloc(size);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
allocations()[p]=size;
return p;
}
但是,您仍然使用内部新操作员来运行std :: unordered_map的风险。