动态库和主程序中的静态类变量

时间:2010-04-12 19:43:39

标签: c++ shared-libraries glibc static-variables dlopen

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

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

2 个答案:

答案 0 :(得分:2)

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

Main Program and Shared Library initializes same static variable in __static_initialization_and_destruction_0

答案 1 :(得分:0)

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