Переменные статических классов в динамической библиотеке и основной программе [дубликат

StackOverflow https://stackoverflow.com/questions/2624880

Вопрос

Я работаю над проектом, который имеет класс «A», который содержит статический класс контейнера STL. Этот класс включен в мою основную программу и файл .so. Класс использует по умолчанию (неявный, не объявленный) конструктор / деструктор. Основная программа загружает файл .so с использованием DLOPEN () и в его деструктора, вызывает dlclose (). Программа вылетает после главных выходов, когда Glibc вызывает деструктор для переменной элемента статического класса. Похоже, что проблема, по-видимому, когда вызывается DLCLOSE (), вызывается деструктор для статической переменной, затем, когда главные выходы () Glibc также вызывают деструктор, что приводит к двойному бесплатному.

У меня есть 2 вопроса, а именно:
1) В этом конкретном случае почему нет двух экземпляров статической переменной (да, я знаю, что звучит несколько смешным, но поскольку как главная программа, так и .so файл имеют отдельно скомпилированные «A», не должны ли они у каждого из них один?)
2) Есть ли способ разрешить эту проблему без переписывания класса «A» не содержать статические переменные элемента?

Это было полезно?

Решение

Этот вопрос был решен в другом вопросе, который я опубликовал. В основном в основной программе имелись две копии статической переменной - один в основной программе и один в общей библиотеке, но линкер времени выполнения разрешал оба копии для основных программ копирования. Смотрите этот вопрос для получения дополнительной информации:

Основная программа и общая библиотека инициализирует ту же статическую переменную в __static_initialization_and_destruction_0

Другие советы

Я считаю, что классы STL всегда динамически созданы, поэтому вы не можете на самом деле называть их статическими. Они существуют на куче. Если член передан на функцию, то копия помещается в статическую память. Вы должны сделать свой собственный деструктор, который не удаляет STL явно один раз.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top