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.
在进入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.
| 归档时间: |
|
| 查看次数: |
1778 次 |
| 最近记录: |