c++ - cpp文件中的全局变量

标签 c++ c++11 access-violation

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

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() 的调用将被调用在未初始化的内存上,从而导致您的崩溃。

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

关于c++ - cpp文件中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11935141/

相关文章:

初始化 DX 时出现 C++ 访问冲突

c++ - 简单但频繁使用 std::stringstream 是否过早悲观?

c++ - QT - 多选

c++ - OpenMP 的理想数据结构

C++ 访问冲突类数组

c++ - 如何以编程方式确定表达式在 C++ 中是右值还是左值?

c++ - 原始指针和智能指针混合函数重载

c++ - MSVC10 Visual Studio 2010是否支持C++显式转换运算符

c++ - 错误:The thread 0x4c0c has exited with code 0 (0x0). Exception thrown: read access violation. **this** was nullptr

c++ - 删除动态创建的二维数组时出现访问冲突消息