全局静态寿命?他们会崩溃您的程序吗?

时间:2018-07-09 17:29:42

标签: c++

假设您定义了几个文件级静态对象:

//foo.cpp
static std::map<std::string, std::string> bar;
static MyCustomCompicatedClass baz;

c ++标准是否规范了它们的生命周期?他们的析构函数到底何时会被调用?

我听说全局静态方法从来都不是一个好主意,如果在vcruntime从内存中装入后(无论如何在Windows上)调用它们的析构函数,则可能会使程序崩溃。真的吗?有人可以分享详细信息吗?那其他平台呢?

2 个答案:

答案 0 :(得分:4)

在一个编译单元中,它们以与构造相反的顺序销毁。

在各个单元(即在单独的cpp文件中)中,它们的构造顺序(以及它们的销毁顺序)也是不确定的(“ static initialization order fiasco”),并且会出现各种问题。

答案 1 :(得分:3)

全局变量通过两次初始化。可以const初始化的对象首先被初始化。接下来,需要动态初始化的对象将被初始化。

未指定初始化两个不同编译单元中的全局变量的顺序。但是,给定编译单元中的变量是确定性的。它们按照它们在文件中出现的顺序进行初始化。

在输入main之前初始化所有全局变量。

该标准保证将以相反的初始化顺序调用这些变量的析构函数。

如果程序有故障,程序可能会在析构函数中崩溃。如果它们是干净的,则您的程序不应崩溃。