деструктор статической переменной вызывается перед деструктором библиотеки

рассмотрим следующий код для динамически загружаемой библиотеки, созданной на Linux с g ++ — 4.7, -fPIC и связано с -rdynamic опция:

struct Wrapper
{
libraryUnregisterCbMap_t instance;
Wrapper() : instance() { HDebugLog("Wrapper CTOR!");}
~Wrapper() { HDebugLog("Wrapper DESTRUCTOR!"); }
};
inline libraryUnregisterCbMap_t& getLibraryUnregisterMap()
{
static Wrapper unregisterLibraryMap;
HDebugLog("getLibraryUnregisterMap: we have " <<unregisterLibraryMap.instance.size() << " elements. the address of the map is " << &unregisterLibraryMap.instance);
return unregisterLibraryMap.instance;
}

void registerLibrary(callbackContainer_t* p)
{
auto& map = getLibraryUnregisterMap();
}

void unregisterLibrary()
{
auto& map = getLibraryUnregisterMap();
}

void __attribute__ ((constructor)) library_init()
{
static callbackContainer_t cbContainer;
HDebugLog("Library constructor: address of static cbContainer is: " << &cbContainer );
registerLibrary( &cbContainer);
}
void __attribute__ ((destructor)) library_fini()
{ unregisterLibrary(); }

интересная / раздражающая часть для меня — то, что library_fini () не вызывается после того, как я вызываю lt_dlcloseтак что это кажется довольно бесполезным для финализации, так как, когда я загружаю этот модуль во время выполнения, деструктор Wrapper случай случается до призыв к library_fini, Излишне говорить, что это поведение по умолчанию не имеет никакого смысла.

Как мне изменить это бессмысленное поведение? мне нужно завершить мои статические данные в моей процедуре завершения библиотеки. Зачем lt_dlclose не вызывает library_fini()?

1

Решение

Позвольте мне сначала признать, что я здесь вне своей глубины. Тем не менее, поиск в Google поднял поток, который, по крайней мере, насколько мне известно, кажется, решает аналогичную проблему с вашей:

http://lists.apple.com/archives/xcode-users/2005/Aug/msg00133.html

Вы делаете то, что делаете на OSX? Есть что-то в потоке (может быть, второе продолжение) о том, что OSX ведет себя по-другому, то есть не вызывает деструкторы, а просто устанавливает свободную память.

Извиняюсь, если ссылка не полезна. Просто думал, что мне пора, так как никто не ответил на данный момент.

Опять же, из моей глубины — но я нашел еще две ссылки, которые могут быть актуальны:

  1. http://phoxis.org/2011/04/27/c-language-constructors-and-destructors-with-gcc/

    • в комментариях люди упоминают о наличии проблем с деструкторами, когда они используют exitи необходимость использовать atexit функция для преодоления этих проблем
  2. http://clang-developers.42468.n3.nabble.com/Priority-settings-for-static-variables-and-attribute-destructor-td4030466.html

    • глобальный ресурс уничтожен раньше атрибут ((деструктор)) вызывается функция. Предлагаемое решение — использовать приоритеты с деструктором.
0

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

Других решений пока нет …

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