У меня есть база и производный класс:
В А.ч .:
//Includes
class A {
protected:
static std::string a;
//other dummy code
};
В A.cpp
std::string A::a = "bar";
//other dummy code
В Б. ч .:
#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 я вижу, что есть недопустимая ошибка free. Почему это происходит?
Я понимаю, что каждый файл .so должен иметь свою собственную копию статических глобальных переменных, но что происходит, когда производный класс находится в другой общей библиотеке, в то время как базовый класс находится в другой общей библиотеке, и в базовом классе есть статические переменные? Как память распределяется / разрушается для статических переменных в базовом классе, между библиотеками, где присутствуют производные классы?
Я понимаю, что каждый файл .so должен иметь свою собственную копию статических глобальных переменных
Вы понимаете неправильно, если только вы не связали A.o в a.so и b.so, каждый файл .so не будет иметь свою собственную копию статического A :: a. A.o следует связывать только с a.so, а b.so следует связывать с a.so, а не A.o