2014-10-08 74 views
1

我有一个底座和一个派生类:这个双免费错误为什么会发生?

在阿:

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

在A.cpp

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

在了Bh:

#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编译为两个单独的共享库“a.so”和“b.so”,然后将它们与Main.cpp链接起来。当我运行该程序时 - 退出时出现损坏的双链表错误。用valgrind运行,我发现有一个无效的错误。为什么会发生?

我知道每个.so文件都必须有自己的静态全局变量副本,但是如果派生类位于不同的共享库中,而基类位于不同的共享库中,并且存在静态变量基类?在派生类存在的库中,如何为基类中的静态变量分配/析构内存?

+0

我制作了可描述的内容,并且没有损坏的双链表错误。 Valgrind报告没有错误。您可能需要提供有关您的平台,工具链和确切构建步骤的更多详细信息。 – 2014-10-08 19:58:37

+3

没有MCVE,没有有用的答案。 – Deduplicator 2014-10-08 19:59:14

回答

2

我明白,每个.so文件必须有自己的静态全局变量

你理解不正确,除非你联系敖到两个a.so和b.so每个.so文件的副本没有它自己的静态A :: a副本。 A.o只能链接到a.so和b.so才能与a.so链接,而不是A.o