Geben Sie die Bau- / Zerstörungsreihenfolge von statischen Einheimischen in verschiedenen Zugriffsmethoden an

Ich habe einen Absturz incxa_finalize Ausführen eines Programms (dies ist ein Programm und keine Bibliothek darin):

$ ./ac-test.exe 
Assertion failed: AcLock.cpp(54): AcLock
libc++abi.dylib: terminate called without an active exception
Abort trap: 6

Die Behauptung / Absturz ist auf die Interaktion zwischen einem Objekt und einem Logger zurückzuführen. Der Logger wird vor dem Objekt zerstört, aber das Objekt verwendet den Logger. Der erworbene Mutex, der die Behauptung oder den Absturz hervorruft, wurde bereits zerstört (daher der Grund)pthread_mutex_lock schlägt fehl, wenn der Logger gesperrt wird).

Ich habe das GCC-Handbuch weiter gelesenAngeben von Variablenattributen undAttribute von Funktionen deklarieren, aber mir fehlt offensichtlich etwas.

Ich habe das Objekt und den Logger in einem gemeinsamen Header innerhalb der Accessors abgelegt und versucht, einen Konstruktionsauftrag anzugeben:

// 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;
}

Das führte zu einer Reihe von Fehlern:

./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...

Ich habe auch versucht, das Attribut auf die Funktion anstatt auf die Variable zu setzen:

// 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;
}

Dies führte zu weiteren Problemen:

./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

Ich habe es auch versucht__attribute__((constructor(50))) anstattinit_priority ohne freude.

Hinweis: Ich arbeite an einer Apple-Maschine. Apple hat eine 'Funktion', bei der die Konstruktorpriorität nur für einzelne Funktionen und Variablen in derselben Datei gilt. Diese können also nicht auf Übersetzungseinheiten verteilt werden.

Wie genau spezifiziere ich die Reihenfolge des Aufbaus und der Zerstörung lokaler statischer Objekte?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage