Wie man mit "exit-time destructor" Warnung im Klang?
In meinem C++11 code, den ich bekommen die schrillen Warnung "Erklärung erfordert eine exit-time destructor" im folgenden Fall:
static const std::map<int, const someStruct> mymap = {
{1, {
"A",
"B",
"C"
}},
{2, {
"D",
"E",
"F"
}}
};
Soweit ich das verstanden habe Google eine "exit-time destructor" ist erforderlich, um zu zerstören, main() und Statik in einer deterministischen Weise zu verhindern, dass Abstürze beim beenden durch "bereits veröffentlicht-Variablen". Ist das richtig? Kann jemand es besser erklären?
Plus: Was kann ich dagegen tun (ich will nicht, um die Warnung zu deaktivieren)? Der obige code wird verwendet in Zusammenhang mit einem thread nur.
Sieht aus wie dies ist die Art und Weise Chrom-befasst sich mit diesen Fällen; wäre das der richtige Weg für meinen Fall auch?
#define CR_DEFINE_STATIC_LOCAL(type, name, arguments) \
static type& name = *new type arguments
Du musst angemeldet sein, um einen Kommentar abzugeben.
Globale und-Funktion, die statische Objekte erhalten Ihre Destruktoren aufgerufen, wenn die Anwendung beendet wird. diese Destruktoren sind "exit time Destruktoren". genannt werden in der umgekehrten Reihenfolge, in der Sie gebaut waren.
Als Sie sagte, wenn einige dieser Destruktoren touch bereits zerstörte Objekte, wird Ihr Programm Abstürzen. Auch, Destruktoren laufen an der Ausfahrt Zeit, wird das Programm beenden langsamer, und die meisten der Zeit sind Sie nicht notwendig für die Korrektheit des Programms (seit Wann wird das Programm beendet, es erscheint alle Speicher sowieso).
Die Warnung wird einfach darauf hingewiesen, dass Sie Destruktoren, dass wir laufen an der Ausfahrt Zeit.
Den fix vorgeschlagen wird heap reservieren das Objekt, die nicht dazu führen, Sie werden automatisch zerstört, Programm beenden. Für Ihren Fall, das ist wahrscheinlich gut genug.
someStruct
's destructor tut. Ich bin generell vorsichtig bei der Verhinderung von Destruktoren nicht ausgeführt werden können. Verwalten von Speicher möglicherweise nicht ein Problem nicht mehr beim Programm beenden, aber andere nicht-triviale Operationen möglicherweise laufen trotzdem. In einem komplexeren Szenario wird es schnell zu schwer, zu beweisen, dass Destruktoren nicht ausgeführt hat, ohne abgeneigt Wirkung. Darüber hinaus die Abschwächung bei Programmende macht sich nur bemerkbar, wenn große Teile des Speichers freigegeben werden.