我们知道静态变量在函数执行时会进行初始化,那么不同文件中定义的静态变量都要进行初始化,这些不同变量的初始化顺序是什么?答案是不确定的。例如:
a.h中
static const std::string msg = "hello";
class Manager {
pubic :
static Manager& Instance() {
static Manager manager;
return manager;
}
void Register() {
std::unordered<std::string,std::string> map;
map[msg] = "world";
}
}
b.h
class Helper {
pubic :
Helper () {
Manage::Instance().Register();
}
}
static Helper help;
分析:这里b.h 定义了静态变量help,help构造函数会调用Manager,最终调用到静态变量msg,但是help和msg静态变量初始化顺序是不确定的,如果help初始化的时候,msg还没有初始化,程序就会崩溃。
解决方法:
1.将msg定义为constexpr 这样msg就是编译期常量,就不会有问题
2.可以将msg定义在函数中,通过函数调用,例如
const std::string& getMsg(){
static const std::string msg = "hello";
return msg;
}