全局静态生存期?他们会让你的程序崩溃吗?

Global statics lifetime? Can they crash your program?

本文关键字:程序 崩溃 静态 生存期 他们 全局      更新时间:2023-10-16

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

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

C++标准是否规定了它们的生命周期?他们的析构函数究竟什么时候会被调用?

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

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

跨单元(即在单独的 cpp 文件中(,它们的构造顺序(以及它们的销毁顺序(是不确定的("静态初始化顺序惨败"(,并且出现了各种问题。

全局变量分两次初始化。首先初始化可以const初始化的那些。接下来初始化需要动态初始化的那些。

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

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

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

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