为什么全局或静态对象在程序退出时会导致崩溃?

问题描述 投票:0回答:2

C++单例设计模式中,obecalp提到:

对于许多较大的程序,尤其是那些带有动态库的程序。由于库卸载时的销毁顺序问题,任何非原始的全局或静态对象都可能导致程序在许多平台上退出时出现段错误/崩溃。这是许多编码约定(包括 Google 的)禁止使用非平凡静态和全局对象的原因之一。

有人可以详细说明为什么会发生这种情况吗?也许是一个例子来解释它?

c++ static global-variables
2个回答
8
投票

您可能听说过 static initialization order fiasco 正在构建的全局引用另一个尚未构建的全局。这个问题的一般解决方案是使用惰性初始化对象(首次使用时初始化)。

好吧,如果一个对象的析构函数引用另一个已经被销毁的对象,那么在销毁时可能会发生同样的惨败;不幸的是,这个问题没有银弹解决方案,因为析构函数的代码可以任意复杂。

一个解决方案就是禁止使用这种不礼貌的功能。


0
投票

我将此作为答案发布,因为我不明白为什么不使用它:

只需在堆栈上创建一个全局对象(来自类),然后将您想要的每个全局对象分配到该对象中(成员指针,在堆上分配)。您可以拥有这些全局对象的访问器,然后在全局对象的析构函数中销毁它们,完美控制每个对象的构造/解构顺序。

哦,顺便说一下,你也可以在里面加锁,包括在“全局”对象之间。

© www.soinside.com 2019 - 2024. All rights reserved.