在C++ Singleton design pattern中,obecalp提到:
对于许多大型程序,尤其是那些具有动态库的程序。由于库卸载时的破坏问题顺序,任何非原始的全局或静态对象都可能导致程序在许多平台上退出时发生段错误/崩溃。这是许多编码约定(包括谷歌)禁止使用非平凡的静态和全局对象的原因之一。
有人可以详细说明为什么会发生这种情况吗?也许是一个例子来解释它?
答案 0 :(得分:8)
您可能听说过static initialization order fiasco正在构建的全局引用另一个尚未构建的全局。此问题的一般解决方案是使用延迟初始化对象(首次使用时初始化)。
嗯,如果一个对象的析构函数引用了另一个已经被破坏的对象,那么在破坏时可能会出现同样的惨败;不幸的是,由于析构函数的代码可能是任意复杂的,所以没有解决这个问题的灵丹妙药。
一种解决方案就是禁止使用这种不礼貌的功能。
答案 1 :(得分:0)
我发布这个作为答案,因为我不明白为什么不使用它:
只需在堆栈上(从类中)创建一个单一的全局对象,并将所需的每个全局分配到该堆中(成员指针,在堆上分配)。您可以拥有这些全局对象的访问器,然后在全局对象的析构函数中销毁它们,完全控制每个对象的构造/解构顺序。
哦,顺便说一下,你也可以锁在那里,包括“全局”物体之间。