2

我在匿名命名空间中有一个全局变量。

namespace {
std::unordered_map<std::string, std::string> m;
}


A::A() { m.insert(make_pair("1", "2")); } // crasches
void A::insert() { m.insert(make_pair("1", "2")); } // ok

如果尝试使用map内部构造函数,我会得到访问冲突读取位置。但是如果我A在初始化后使用它,它就可以工作。
这种行为正确吗?

4

2 回答 2

8

A其构造函数调用导致崩溃的对象的范围是什么?

无法保证静态初始化程序的执行顺序,因此,如果您的A对象也是全局或静态的(按原样m),那么就作为有效构造的对象而言,它很可能m还不存在,这意味着您的调用std::unordered_map::insert()将在未初始化的内存上调用,从而导致您的崩溃。

一个解决方案是确保您A所依赖的所有实例m都是由您显式构建的,而不是静态/全局构建的(或者正如评论者所添加的,如果它们在同一个 TU 中,则正确地对它们进行排序),或者更改结构A这样您就可以稍后在实例上调用函数以进行插入。这是否是一个有效的解决方案更多地取决于A.

于 2012-08-13T13:29:57.767 回答
2

您可能正在A应用程序某处的静态上下文中创建一个类型类,即在您的main()函数执行之前,因此 beforem已被初始化。

于 2012-08-13T13:31:39.777 回答