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
};

主要.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 文件都必须有自己的静态全局变量副本,但是当派生类在不同的共享库中而基类在不同的共享库中并且基类中有静态变量时会发生什么?如何跨存在派生类的库为基类中的静态变量分配/销毁内存?

4

1 回答 1

2

我了解每个 .so 文件都必须有自己的静态全局变量副本

您理解错误,除非您将 Ao 链接到 a.so 和 b.so 中,否则每个 .so 文件都不会拥有它自己的静态 A::a 副本。Ao 应该只链接到 a.so 并且 b.so 应该链接到 a.so,而不是 Ao

于 2014-10-08T19:59:49.457 回答