在Linux上,为什么析构函数在C ++的全局variables的共享实例上运行两次?

在Linux上,我从一个定义了全局variables的静态库中生成了一些C ++代码。 这个全局variables的一个实例在引用它的符号的两个共享库之间共享。

当进程closures并且运行静态终止阶段时,我看到这个共享实例上的析构函数运行了两次! 据推测,每个图书馆每个卸载。

这个问题与我最近在这里看到的另一个问题密切相关: 相关的问题 。 这听起来像是一样的行为,但没有讨论为什么会发生。

有人知道背后的理论解释吗?

Solutions Collecting From Web of "在Linux上,为什么析构函数在C ++的全局variables的共享实例上运行两次?"

如果你拿一个裸指针并把它放在一个智能指针(两次)中,它将会破坏两次,每个集装箱的引用次数降到零。

所以,如果你通过裸指针进入两个库,那就这样做了。 每个人把它放在一个共享的指针对象,每个人都毁灭。 如果你可以在dtor中看到栈回溯,那么应该在两个库中显示它。

C ++有一个叫做“一个定义规则”的规则:

每个程序应该包含该程序中使用的每个非内联函数或对象的一个​​定义; 不需要诊断。 该定义可以在程序中显式出现,可以在标准库或用户定义的库中找到,或者(在适当时)隐式定义(见12.1,12.4和12.8)。

维基百科有一篇文章 ,更详细地解释了这一点。

你没有在你的问题中发布代码,所以我不能确定你的情况,但是在你连接的问题中,问题中的例子是在两个共享库中定义相同的变量。 这违反了“一个定义规则”,显然动态链接器的定型策略依赖于,导致析构函数被调用两次。