C ++ ruft automatisch Destruktoren aller lokalen Variablen im Block in umgekehrter Reihenfolge auf, unabhängig davon, ob der Block normal verlassen wird (die Kontrolle fällt durch) oder eine Ausnahme ausgelöst wird.
Sieht wie der Begriff
Ein Objekt wird automatisch zerstört, wenn es "außerhalb des Bereichs" ist. Dies könnte als "automatische Speicherrückgewinnung" bezeichnet werden, bezieht sich jedoch tatsächlich auf die Garbage Collection (es gibt mehrere Papiere mit dieser Phrase in ihrem Namen, die den Begriff "Garbage Collection" verwenden). Wenn es verwendet wird, um die richtige Paarung von Öffnen / Schließen, Sperren / Entsperren oder anderen Formen der Ressourcenerfassung mit der entsprechenden Freigabe sicherzustellen, wird es als Entwurfsmuster von Ressourcenerfassung ist Initialisierung (RAII) , was etwas ironisch ist, da der Hauptaspekt von RAII nicht die Initialisierung oder der Erwerb von Ressourcen ist, sondern vielmehr deren Zerstörung.
In beiden Fällen erfolgt die Stapelabwickelung, nur wird der Stapel bei der normalen Ausführung nur in den Kontext der aufrufenden Methode (oder des Blocks) abgewickelt, wenn die ausführende Methode zurückkehrt (oder der Block beendet wird). Lokale Variablen werden auf dem Stapel zugewiesen, sodass sie in umgekehrter Reihenfolge der Zuordnung bereinigt werden, und dieser Prozess wird als Abwickeln bezeichnet. Es unterscheidet sich nicht von der Verarbeitung anderer Daten, die Sie in einer LIFO-Struktur speichern würden - z. rückgängig machen, wiederholen.
Wenn eine Ausnahme ausgelöst wird, löscht der Handler den Stapel durch null oder mehr Methoden, bis er einen findet, der die Ausnahme abfangen kann, oder bis er den Anfang des Stapels erreicht, an welchem Punkt der unbehandelte Ausnahmebehandler aufgerufen wird .
Es scheint Konvention zu sein, im Falle der Ausnahmebehandlung nur den Begriff Stack-Unwinding zu verwenden, aber es ist der gleiche Prozess, der in jedem dieser Fälle auftritt. Der spezielle Fall, bei dem der Stapel aufgrund einer auslaufenden Methode abgewickelt wird, wird als Zurückgeben bezeichnet, und es scheint keine Konvention für die Benennung zu geben, was passiert, wenn ein Bereichsblock eines Codes verlassen wird.
Die lokale Variable wird zerstört, wenn sie den Gültigkeitsbereich verlässt. Vielleicht wird der Prozess so genannt, als würde man den Rahmen verlassen?
Ich bin mir nicht sicher, dass es einen Namen dafür gibt. Stack-Variablen sind so automatisch, dass sich niemand um sie kümmert, niemals, nicht einmal genug, um diesem automatischen Bereinigungsprozess einen Namen zu geben.
Nennen Sie es "out of scope", denke ich.
Tags und Links c++ destructor stack-unwinding