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

标签 c++ linux shared-libraries global-variables destructor

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

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

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

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

最佳答案

如果您将裸指针放入智能指针(两次),它将析构两次,每次容器引用计数降为零时一次。

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

关于c++ - 在 Linux 上,为什么析构函数在 C++ 中的全局变量共享实例上运行两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409034/

相关文章:

c++ - 多重虚拟继承

node.js - 如果网络连接断开,请重新启动 systemd 服务

arrays - BASH - 将文件内容推送到数组中 100000 行/更多行

linux - 在 Linux 下以编程方式对 USB 内存棒进行分区

c++ - 为什么我在为 vector <int> 实现这个简单的散列时出错?

c++ - 我可以在这里使用模板特化或类型强制吗?

c++ - C 库导出哪些函数?

android - 如何符号化剥离的共享库的堆栈跟踪

c++ - 按位或在转换为 int32 之前

c - 动态链接器如何知道要在哪个库中搜索符号?