Mer*_*rni 2 c++ access-violation c++11
我在匿名命名空间中有一个全局变量.
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
Run Code Online (Sandbox Code Playgroud)
如果尝试使用map构造函数内部,我会获得Access违规读取位置.但如果我A在初始化之后使用它就可以了.
这种行为是否正确?
A构造函数调用导致崩溃的对象的范围是什么?
无法保证执行静态初始化程序的顺序,因此如果您的A对象也是全局的或静态的(原样m),那么就很可能m在有效构造的对象方面尚不存在,这意味着您的调用std::unordered_map::insert()将在未初始化的内存上调用,从而导致崩溃.
一个解决方案是确保您A所依赖的所有实例m都是由您明确构建的,而不是静态/全局构建(或者如果它们在同一个TU中,则添加了评论者,以便正确排序),或者更改结构的A,这样你可以调用一个实例函数以后才能做插入.这是否是一个有效的解决方案更多地取决于总体使用A.