Почему происходит ошибка двойного освобождения?

У меня есть база и производный класс:

В А.ч .:

//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 должен иметь свою собственную копию статических глобальных переменных, но что происходит, когда производный класс находится в другой общей библиотеке, в то время как базовый класс находится в другой общей библиотеке, и в базовом классе есть статические переменные? Как память распределяется / разрушается для статических переменных в базовом классе, между библиотеками, где присутствуют производные классы?

1

Решение

Я понимаю, что каждый файл .so должен иметь свою собственную копию статических глобальных переменных

Вы понимаете неправильно, если только вы не связали A.o в a.so и b.so, каждый файл .so не будет иметь свою собственную копию статического A :: a. A.o следует связывать только с a.so, а b.so следует связывать с a.so, а не A.o

2

Другие решения


По вопросам рекламы [email protected]