Укажите порядок построения / уничтожения статических локальных объектов в разных аксессорах
я испытываю аварию вcxa_finalize
запуск программы (это программа, а не библиотека внутри):
$ ./ac-test.exe
Assertion failed: AcLock.cpp(54): AcLock
libc++abi.dylib: terminate called without an active exception
Abort trap: 6
Утверждение / сбой происходит из-за взаимодействия между объектом и регистратором. Регистратор уничтожается перед объектом, но объект использует регистратор. Таким образом, получаемый мьютекс, который выдает утверждение или сбой, уже был уничтожен (поэтому причинаpthread_mutex_lock
не удается при блокировке регистратора) .I '
прочитал руководство по GCCУказание атрибутов переменных а такжеОбъявление атрибутов функций, но я'Я явно что-то упустил.
Я поместил объект и регистратор в общий заголовок в средствах доступа и попытался указать порядок построения:
// AcGlobals.h
static AcLogger& GetLogger() {
static AcLogger logger __attribute__(init_priority(50));
return logger;
}
static AcSocketList& GetAcceptSockets() {
static AcSocketList sockets __attribute__(init_priority(100));
return sockets;
}
Это привело к куче ошибок:
./AcGlobals.h:24:46: error: expected ';' at end of declaration
static AcLogger logger __attribute__((init_priori...
./AcGlobals.h:24:47: warning: declaration does not declare anything
[-Wmissing-declarations]
static AcLogger logger __attribute__((init_priori...
Я также попытался поместить атрибут в функцию, а не в переменную:
// AcGlobals.h
static AcLogger& GetLogger() __attribute__(init_priority(50)) {
static AcLogger logger;
return logger;
}
static AcSocketList& GetAcceptSockets() __attribute__(init_priority(100)) {
static AcSocketList sockets;
return sockets;
}
Это привело к большему количеству проблем:
./AcGlobals.h:22:53: warning: GCC does not allow init_priority attribute in this
position on a function definition [-Wgcc-compat]
static AcLogger& GetLogger() __attribute__((init_priority(50))) {
^
./AcGlobals.h:22:53: error: can only use 'init_priority' attribute on file-scope
definitions of objects of class type
Я тоже пробовал__attribute__((constructor(50)))
вместоinit_priority
без радости
Заметка: ЯЯ работаю на машине Apple. У Apple естьособенность' где приоритет конструктора применяется только к украшенным функциям и переменным в одном и том же файле. Таким образом, они не могут быть распределены по единицам перевода.
Как именно указать порядок строительства и разрушения локальных статических объектов?