假设您定义了几个文件级静态对象:
//foo.cpp
static std::map<std::string, std::string> bar;
static MyCustomCompicatedClass baz;
c ++标准是否规范了它们的生命周期?他们的析构函数到底何时会被调用?
我听说全局静态方法从来都不是一个好主意,如果在vcruntime从内存中装入后(无论如何在Windows上)调用它们的析构函数,则可能会使程序崩溃。真的吗?有人可以分享详细信息吗?那其他平台呢?
答案 0 :(得分:4)
在一个编译单元中,它们以与构造相反的顺序销毁。
在各个单元(即在单独的cpp文件中)中,它们的构造顺序(以及它们的销毁顺序)也是不确定的(“ static initialization order fiasco”),并且会出现各种问题。
答案 1 :(得分:3)
全局变量通过两次初始化。可以const
初始化的对象首先被初始化。接下来,需要动态初始化的对象将被初始化。
未指定初始化两个不同编译单元中的全局变量的顺序。但是,给定编译单元中的变量是确定性的。它们按照它们在文件中出现的顺序进行初始化。
在输入main
之前初始化所有全局变量。
该标准保证将以相反的初始化顺序调用这些变量的析构函数。
如果程序有故障,程序可能会在析构函数中崩溃。如果它们是干净的,则您的程序不应崩溃。