2013-01-15 12 views
22

In meinem C++ 11-Code erhalte ich die Klirren Warnung "Erklärung erfordert eine Exit-Zeit destructor" im folgenden Fall:Wie behandelt man die Warnung "exit-time destructor" in clang?

static const std::map<int, const someStruct> mymap = { 
    {1, { 
     "A", 
     "B", 
     "C" 
    }}, 
    {2, { 
     "D", 
     "E", 
     "F" 
    }} 
}; 

Soweit ich verstehe Google ein "Exit-time destructor" erforderlich ist, Zerstören von main() und Statik auf deterministische Art, um Abstürze beim Beenden aufgrund "bereits freigegebener Variablen" zu verhindern. Ist das richtig? Kann es jemand besser erklären?

Plus: Was kann ich dagegen tun (ich möchte die Warnung nicht deaktivieren)? Der obige Code wird nur im Zusammenhang mit einem Thread verwendet.

Sieht so aus, als ob Chromium sich mit diesen Fällen beschäftigt; Wäre das auch der richtige Weg für meinen Fall?

#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \ 
    static type& name = *new type arguments 

(Quelle: https://chromium.googlesource.com/chromium/src/+/32352ad08ee673a4d43e8593ce988b224f6482d3/base/basictypes.h)

Antwort

14

Globale und Funktion statische Objekte werden ihre Destruktoren aufgerufen erhalten, wenn Ihre Anwendung beendet wird. Diese Destruktoren sind "Destruktoren der Ausgangszeit". und werden in der umgekehrten Reihenfolge aufgerufen, in der sie konstruiert wurden.

Wie Sie sagten, wenn einige dieser Destruktoren bereits zerstörte Objekte berühren, könnte Ihr Programm abstürzen. Destruktoren, die zum Zeitpunkt des Beendens ausgeführt werden, machen das Programm langsamer und meistens sind sie für die Korrektheit des Programms nicht notwendig (da das Programm nach dem Beenden des Programms sowieso seinen gesamten Speicher freigibt).

Die Warnung weist einfach darauf hin, dass Sie Destruktoren haben, die zum Zeitpunkt des Beendens ausgeführt werden.

Die von Ihnen vorgeschlagene Lösung wird das Objekt haufenweise zuweisen, wodurch es beim Programm-Exit nicht automatisch zerstört wird. Für Ihren Fall ist das wahrscheinlich gut genug.

+0

Abhängig davon, was 'somestruct' Destruktor tut. Ich bin generell vorsichtig davor, Destruktoren davon abzuhalten, ausgeführt zu werden. Die Speicherverwaltung ist beim Programm-Exit möglicherweise kein Problem mehr, aber andere nicht-triviale Operationen müssen möglicherweise trotzdem ausgeführt werden. In einem komplexeren Szenario wird es schnell schwierig zu beweisen, dass das Ausführen von Destruktoren keine nachteiligen Auswirkungen hat. Außerdem ist die Verlangsamung beim Verlassen des Programms nur dann bemerkbar, wenn große Teile des Speichers freigegeben werden. –

+0

Ja, deshalb sage ich "wahrscheinlich" und "die meiste Zeit". Wenn Ihre Destruktoren über eine Art von IO mit dem Rest des Systems interagieren, sollten diese Destruktoren ausgeführt werden. Ein einfaches Beispiel wäre ein globales Konfigurationsobjekt, das die Einstellungen auf der Festplatte speichert, wenn das Programm beendet wird, und Sie verlassen sich auf den Destruktor, um zu wissen, wann dies geschieht (nicht, dass ich mich für Code ausspreche, der dies tut). – yiding

+1

@KonradRudolph Die Struktur ist drei "const char *". Daher wendet mein Mitarbeiter zu Recht ein, dass die Heap-Zuweisung zu viel ist. Gibt es eine Möglichkeit, diese Warnung ohne Heap-Zuweisung freizugeben? –

Verwandte Themen