首页 > 解决方案 > 静态对象和全局对象的销毁顺序是什么?

问题描述

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

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

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

任何指针将不胜感激。

标签: c++c++11singleton

解决方案


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

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

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

破坏的相反顺序是标准的。

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

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

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

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


推荐阅读