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



在C++ Singleton 设计模式中,obecalp 提到:

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

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

您可能听说过静态初始化顺序惨败,其中正在构建的全局引用另一个尚未构建的全局。此问题的一般解决方案是使用延迟初始化对象(首次使用时初始化)。

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

一种解决方案是简单地禁止使用这种不礼貌的功能。

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

只需在堆栈上创建一个全局对象(

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

哦,顺便说一下,你也可以在那里有锁,包括"全局"对象之间。

相关内容

  • 没有找到相关文章

最新更新