【问题标题】:What is the order of destruction for static objects and global objects?静态对象和全局对象的销毁顺序是什么?
【发布时间】:2021-10-26 06:58:45
【问题描述】:

如果在一个程序中我创建了一个 meyer 单例和一个在其构造函数和析构函数中都使用这个 meyer 单例的对象,那么只要使用 meyer 单例的对象在单例本身之前被销毁(就像它是在函数范围内)。

现在,如果我将同一个对象设为全局对象,我会看到 seg 错误。原因是单例在全局对象之前被销毁。

这是编译器定义的行为还是标准定义的行为?我们有什么办法可以修改这种行为?

任何指针将不胜感激。

【问题讨论】:

标签: c++ c++11 singleton


【解决方案1】:

静态对象和全局对象的销毁顺序是什么?

具有静态存储持续时间的对象的销毁顺序与它们的初始化顺序相反。

这是编译器定义的行为还是标准定义的行为?

破坏的逆序是标准的。

非本地静态对象的初始化顺序与单个翻译单元内的声明顺序相同。未指定跨翻译单元的顺序。本地静态对象在执行第一次通过它们的声明时被初始化。

我们有什么办法可以修改这种行为吗?

您可以通过重新排序声明来影响翻译单元中非本地静态对象的初始化顺序。您可以通过提前或稍后调用该函数来影响本地静态对象的初始化顺序。改变初始化的顺序会间接影响破坏的顺序。

您不能影响翻译单元之间具有静态存储持续时间的非本地对象的初始化顺序,并且您不能依赖该顺序。

【讨论】:

  • 您写道“非本地静态对象的初始化顺序与单个翻译单元内的声明顺序相同。翻译单元之间的顺序未指定。”我的问题是上面引用的语句中的“您是在谈论静态初始化还是动态初始化”?你也可以找到源代码。你的说法是否等同于说“不同翻译单元中静态变量的初始化是不确定的”。这适用于动态初始化。
  • @AanchalSharma 我说的是动态初始化阶段。据我所知,静态初始化阶段(静态对象)的顺序是无关紧要的,因为它不能有相互依赖关系。
  • @AanchalSharma 源是 C++ 标准。请参阅 [basic.start.dynamic]、[basic.start.term]、[stmt.dcl] 部分。
  • @AanchalSharma Is your statement equivalent to saying "Initialization of static variables in different translation units is indeterminately sequenced." 是的。这将是一种在技术上更准确的说法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2015-01-13
  • 2013-04-07
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
相关资源
最近更新 更多