我正在研究一个包含静态STL容器类的“ A”类的项目。该类都包含在我的主程序和.so文件中。该类使用默认值(隐式,未声明)构造函数/驱动器。主程序使用dlopen()及其destructor加载.so文件,调用dlclose()。当GLIBC调用静态类成员变量的驱动器时,该程序在Main退出后崩溃。问题似乎是当调用DLClose()时,调用了静态变量的破坏者,那么当Main Exits()GliBC还调用destructor时,将导致双重免费。

我有2个问题,即:
1)在这种特殊情况下,为什么没有静态变量的两个副本(是的,我知道这听起来有些荒谬,但是由于主程序和.SO文件都单独编译了“ A”一?)
2)有没有任何方法可以在不重写类“ A”的情况下解决此问题,以不包含静态成员变量?

有帮助吗?

解决方案

我发布的另一个问题已经解决了这个问题。基本上,确实有两个静态变量的副本 - 一个在主要程序中,另一个在共享库中,但是运行时链接器正在将两个副本分配给主程序副本。有关更多信息,请参见此问题:

主要程序和共享库在__STatic_Initialization_and_desteruction中初始化相同的静态变量

其他提示

我相信STL类总是动态创建的,因此您实际上不能称它们为静态。它们存在于堆中。如果将成员传递给函数,则将副本放入静态内存中。您必须制作自己的驱动器,以明确删除STL一次。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top