2013-04-02 3 views
1

рассмотрит следующий код для динамической загруженной библиотеки, построенной с г ++ - 4.7 на Linux, -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()?

ответ

0

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

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

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

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

Edit:

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

  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

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