c++ - 什么时候创建全局变量?

标签 c++ initialization

我有一段代码结构如下:

a.cpp:  
    #include "b.hpp"  
    const unsigned a =  create(1);


b.cpp:
    map<int, string> something; // global variable
    unsigned create(unsigned a){
        something.insert(make_pair(a, "somestring"));
        return a;
    }

现在,这抛出一个段错误,valgrind 说 map 还没有创建。它是如何工作的,我应该如何改变它?

最佳答案

C++ 没有定义在程序启动期间构造全局变量的顺序。 a 可以在 something 构造之前先初始化,这将导致上述问题。当您开始构建依赖于正在初始化的其他全局变量的全局变量时,您就会遇到经典的静态初始化顺序失败

解决上述情况的一种简单方法是使 something 静态化并将其移动到您的 create 函数中。

unsigned create(unsigned a)
{
    static map<int, string> something;
    something.insert(make_pair(a, "somestring"));
    return a;
}

这将保证在第一次调用 create 时创建 something

关于c++ - 什么时候创建全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19618801/

相关文章:

c++ - 静态类成员的定义内初始化的最佳替代方案? (针对 SVN 关键字)

python - __init__ 作为构造函数?

C++ 将 uint8_t 转换为 unsigned long

c++ - 类中的 std::map :在执行速度和内存使用之间进行权衡

java - 并行执行 Spring 初始化 Bean

c++ - 在没有默认构造函数的情况下初始化类

c++ - 在 C++ 中,setter 和 getter 以及构造函数之间有什么区别?

java - 基于终端的角色扮演游戏

c++ - bool 自动转换为 nullptr_t

c - 为什么灵活数组成员的静态初始化有效?