访问std :: MAP中的静态构造函数New New拨号
Access std::map within operator new called by static constructor
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的风险。
相关文章:
- 运算符 new 的执行顺序和构造函数的参数
- 使用复制构造函数初始化 new[]
- 在执行new期间是否可以在构造函数中传递不同的参数?
- 双指针在使用 new 时不调用对象构造函数
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 使用 "new" 命令在 C++ 中的类构造函数中分配 2D 数组
- new[] / delete[] 并在C++中抛出构造函数/析构函数
- 构造函数不会将使用 new 初始化的数组作为参数
- "new"运算符是否总是调用构造函数?
- 重载运算符 new(),为什么构造函数被调用两次?
- 我应该使用<Object> shared_ptr myObject = (shared_ptr) <Object>new Object() 来访问私有构造函数吗?
- 如何安全地将 new 创建的对象传递到构造函数中
- 如果所述结构具有构造函数,则带有 new[] 的结构数组似乎不起作用
- C++构造函数中的'new auto'
- 构造函数中的 Malloc 在通过 New 调用时返回 NULL
- 访问std :: MAP中的静态构造函数New New拨号
- 尝试在没有new的情况下使用我的自定义类构造函数
- 为什么智能指针不能在其构造函数中为我调用 new()?
- 运算符在C++中何时调用'new'构造函数
- 奇怪的'new'构造函数