4

我正在开发一个包含静态 stl 容器类的“A”类的项目。这个类包含在我的主程序和 .so 文件中。该类使用默认(隐式,未声明)构造函数/析构函数。主程序使用 dlopen() 加载 .so 文件,并在其析构函数中调用 dlclose()。当 glibc 调用静态类成员变量的析构函数时,程序在 main 退出后崩溃。问题似乎是,当调用 dlclose() 时,调用了静态变量的析构函数,然后当 main exits() glibc 也调用析构函数时,导致双重释放。

我有两个问题,即:
1)在这种特殊情况下,为什么没有静态变量的两个副本(是的,我知道这听起来有些荒谬,但是由于主程序和 .so 文件都有一个单独编译的“A” ,他们不应该每个人都有一个吗?)
2)有没有办法解决这个问题而无需重写类'A'以不包含静态成员变量?

4

2 回答 2

2

这个问题已在我发布的另一个问题中得到解决。基本上静态变量确实有两个副本——一个在主程序中,一个在共享库中,但是运行时链接器将两个副本解析为主程序副本。有关更多信息,请参阅此问题:

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

于 2010-04-13T20:14:12.890 回答
0

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

于 2010-04-13T03:37:46.160 回答