什么时候创建全局变量?

dar*_*enn 8 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;
    }
Run Code Online (Sandbox Code Playgroud)

现在,这引发了一个段错误,valgrind说地图尚未创建.它是如何工作的,我应该如何改变它?

gre*_*olf 10

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

修复上述场景的一种简单方法是创建something静态并将其移动到您的create函数中.

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

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


BЈо*_*вић 8

在进入main()之前创建所有全局变量,但c ++标准未指定它们在不同转换单元之间的构造顺序.它们在同一翻译单元中的构造顺序是按照规范的顺序.

你可以形成一个由标准保证的东西.像这样的东西:

map<int, string>& mymap(){
    static map<int, string> something;
    return something;
}

unsigned create( unsigned a ) {
    mymap().insert(make_pair(a, "somestring"));
    return a;
}
Run Code Online (Sandbox Code Playgroud)

在第一次调用mymap()函数时会创建map.

  • 每个翻译单元内的全局变量按其声明顺序构建.确实没有指定**翻译单元之间的顺序**. (2认同)