【发布时间】:2021-10-26 06:58:45
【问题描述】:
如果在一个程序中我创建了一个 meyer 单例和一个在其构造函数和析构函数中都使用这个 meyer 单例的对象,那么只要使用 meyer 单例的对象在单例本身之前被销毁(就像它是在函数范围内)。
现在,如果我将同一个对象设为全局对象,我会看到 seg 错误。原因是单例在全局对象之前被销毁。
这是编译器定义的行为还是标准定义的行为?我们有什么办法可以修改这种行为?
任何指针将不胜感激。
【问题讨论】:
-
initialization 和destruction 的顺序是部分定义的。最重要的部分是translation units之间的顺序没有定义。
-
销毁顺序与构造完全相反(按完成顺序),但翻译单元之间的构造顺序未指定。 Meyer 的单例应该可以防止这个问题,所以听起来你的单例实现至少有一个问题。请发帖minimal reproducible example。
-
见Static Initialization Order Fiasco(也适用于销毁)。