为什么会发生这种双重自由错误?

时间:2014-10-08 19:49:34

标签: c++ destructor double-free

我有一个基础和一个派生类:

在A.h:

//Includes
class A {
    protected:
       static std::string a;
       //other dummy code
};

在A.cpp

std::string A::a = "bar";
//other dummy code

在B.h:

#include "A.h"
//Other includes
class B : public A {
    public:
        int c;
        //other dummy code
};

Main.cpp的:

#include "A.h"
#include "B.h"

int main() {
   printf("foo");
   return 0;
}

现在我将A.cpp和B.cpp编译成两个独立的共享库,如#34; a.so"和" b.so"然后将它们链接到Main.cpp。当我运行该程序时 - 它退出与损坏的双链表错误。使用valgrind运行我发现有一个无效的自由错误。为什么会这样?

据我所知,每个.so文件都必须有自己的静态全局变量副本,但是当派生类位于不同的共享库中而基类位于不同的共享库中并且存在静态变量时会发生什么情况。基类?如何在存在派生类的库中为基类中的静态变量分配/销毁内存?

1 个答案:

答案 0 :(得分:2)

  

据我所知,每个.so文件都必须有自己的静态全局变量副本

您理解不正确,除非您将A.o链接到a.so和b.so.so每个.so文件都没有它自己的静态A :: a副本。 A.o应该只链接到a.so和b.so应该与a.so链接,而不是A.o