【问题标题】:Global statics lifetime? Can they crash your program?全局静力学寿命?他们可以让你的程序崩溃吗?
【发布时间】:2018-07-09 17:29:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 文件级静态数据按照与加载相反的顺序销毁,无论该顺序是什么。
  • 你似乎同时问了一堆问题。 This question 是其中一些的副本。

标签: c++


【解决方案1】:

在一个编译单元内,它们以与它们构建时相反的顺序被销毁。

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

【讨论】:

    【解决方案2】:

    全局变量在两遍中初始化。可以const-initialized 的先初始化。接下来初始化需要动态初始化的那些。

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

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

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

    如果程序有问题,程序可能会在析构函数中崩溃。如果它们是干净的,您的程序就不会崩溃。

    【讨论】: