我在匿名命名空间中有一个全局变量。
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
,我会得到 Access violation 读取位置。
但是,如果我在 A
初始化后使用它,它就可以工作。
这种行为是否正确?
最佳答案
A
对象的构造函数调用导致崩溃的范围是什么?
无法保证静态初始化器的执行顺序,因此如果您的 A
对象也是全局对象或静态对象(如 m
是),它是m
很可能在成为有效构造的对象方面尚不存在,这意味着您对 std::unordered_map::insert()
的调用将被调用在未初始化的内存上,从而导致您的崩溃。
一个解决方案是确保所有依赖于 m
的 A
实例都是由您显式构造的,而不是静态/全局构造的(或者如评论者所补充的那样,如果它们在同一个 TU 中,则对它们进行正确排序),或者更改 A
的结构,以便稍后可以在实例上调用函数以执行插入。这是否是一个有效的解决方案更多地取决于 A
的总体用法。
关于c++ - cpp文件中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11935141/