在C++ Singleton design pattern中,obecalp提到:
对于许多较大的程序,特别是那些具有动态库的程序。任何非原语的全局或静态对象都会在许多平台上的程序退出时导致分段故障/崩溃,这是由于库卸载时出现的破坏顺序问题。这是许多编码约定(包括谷歌的)禁止使用非平凡的静态和全局对象的原因之一。
有人能解释一下为什么会发生这种事吗?也许可以举个例子来解释?
发布于 2014-01-16 09:28:27
您可能听说过static initialization order fiasco,其中正在构建的全局引用了另一个尚未构建的全局。此问题的一般解决方案是使用延迟初始化对象(第一次使用时初始化)。
那么,如果一个对象的析构函数引用了另一个已经被破坏的对象,那么同样的失败可能会在销毁时发生;不幸的是,这个问题没有灵丹妙药的解决方案,因为析构函数的代码可以是任意复杂的。
一个解决方案就是禁止使用这种不礼貌的功能。
发布于 2015-09-21 12:40:53
我张贴这篇文章是为了回答这个问题,因为我不明白为什么没有这样做:
只需在堆栈上创建一个全局对象(来自类),并将每个全局对象分配到该对象(成员指针,在堆上分配)。您可以拥有这些全局对象的访问器,然后在全局对象的析构函数中销毁它们,并完全控制每个对象的构造/解构顺序。
哦,顺便说一句,你也可以在里面有锁,包括“全局”对象之间的锁。
https://stackoverflow.com/questions/21157476
复制相似问题