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
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. –
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
@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? –