gpt4 book ai didi

c++ - 在静态构造函数调用的 operator new 中访问 std::map

转载 作者:太空宇宙 更新时间:2023-11-04 14:13:35 24 4
gpt4 key购买 nike

1) 我的项目中有一些静态类在它们的构造函数中分配变量。

class StaticClass
{
public:
char *var;
StaticClass()
{
var=new char[100];
}
};
static StaticClass staticClass;

2) 我已经覆盖了 new 和 delete 运算符,并使它们跟踪 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 的构造函数在 allocations 的构造函数调用之前被调用,因此 operator new() 尝试在 allocations 初始化之前将 size 插入到 allocations 中,这会出错。

之前遇到静态构造顺序有问题的时候,我只是简单的把std::map做成一个NULL指针,然后在第一次使用的时候进行初始化,保证第一次有效插入它:

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

但是,这将不再有效,因为我将在 operator new() 中调用 new,从而创建无限递归循环。

我知道我可以通过制作另一个特殊版本的 operator new 来解决这个问题,它采用一些 token 参数来区分它,并且只使用它来初始化分配,但是在更一般的(学习)意义上,我更喜欢以某种方式要么

a) 强制分配在 StaticClass 执行之前初始化(最好)

b) 有一些方法可以调用默认运算符 new 而不是我重写的运算符(我认为这是不可能的,但是......)

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;
}

但是,您仍然会冒着在内部使用 operator new 的 std::unordered_map 的风险。

关于c++ - 在静态构造函数调用的 operator new 中访问 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13001562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com