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

Sco*_*ron 7 c++ linux destructor global-variables shared-libraries

在Linux上,我从一个定义全局变量的静态库中生成了一些C++代码.此全局变量的单个实例在引用其符号的两个共享库之间共享.

当进程关闭并运行静态终止阶段时,我看到此共享实例上的析构函数运行了两次!据推测每个库卸载一次.

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

有谁知道这种行为背后的理论解释?

boa*_*der 2

如果您将裸指针放入智能指针(两次),它将破坏两次,每次容器引用计数降至零。

因此,如果将裸指针传递到两个库中,就可以了。每个人都将其放入共享指针对象中,并且每个人都会进行销毁。如果您可以在 dtor 期间看到堆栈回溯,则应该表明它发生在两个库中。