2010-04-09 6 views
8

C++ ruft automatisch Destruktoren aller lokalen Variablen im Block in umgekehrter Reihenfolge auf, unabhängig davon, ob der Block normal beendet wird (die Steuerung fällt durch) oder eine Ausnahme ausgelöst wird.Wie zerstört man lokale Variablen, wenn ein Block normalerweise in C++ aufgerufen wird?

Sieht aus wie der Begriff stack unwinding gilt nur für letztere. Wie wird der erstgenannte Prozess (der normale Ausgang des Blocks) bezüglich der Zerstörung lokaler Variablen genannt?

+1

Es wird wirklich nichts genannt. Überall im Standard sagt es Dinge wie "... automatische Variablen werden am Ende des Blocks zerstört". Es gibt diesem Prozess nie einen Namen. – GManNickG

+0

@GMan - Speichern Sie die Unicorns: Ich denke, Sie könnten dies als Antwort hinzufügen. Erwähnen, was der Standard sagt, ist ein starkes Argument. – sharptooth

Antwort

5

Ein Objekt wird automatisch zerstört, wenn es "außerhalb des Geltungsbereichs" 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 andere Formen des Ressourcenerwerbs mit ihrer entsprechenden Freigabe sicherzustellen, dann ist es bekannt als das Entwurfsmuster von Resource Acquisition is Initialization (RAII), was angesichts des Hauptaspekts von RAII etwas ironisch ist ist nicht die Initialisierung oder der Erwerb der Ressource, sondern ihre Zerstörung.

2

Die lokale Variable wird zerstört, wenn sie den Gültigkeitsbereich verlässt. Vielleicht wird der Prozess wie "out of scope" bezeichnet?

1

Ich bin mir nicht sicher, dass es einen Namen dafür gibt. Stack-Variablen sind so automatisch, dass niemand sich Sorgen um sie macht, überhaupt nicht einmal genug, um einen Namen für diesen automatischen Bereinigungsprozess zu geben.

Nennen Sie es "aus dem Rahmen gehen", denke ich.

1

Ich habe es immer gesprochen als "außerhalb des Geltungsbereichs" oder genauer gesagt "eine auto Variable außerhalb des Geltungsbereichs" gesprochen.

1

Wenn das, was Sie fragen, wie der Aufruf der Methode tatsächlich in Maschinencode umgesetzt wird, würde ich sagen, dass es auf der Aufrufkonvention abhängen würde verwendet

3

Stapel Abwickeln in diesen beiden Fällen geschehen, es ist nur, dass unter normalen Ausführung Der Stapel wird 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. 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 wiederholen.

Wenn eine Ausnahme ausgelöst wird, wird der Handler den Stapel durch null oder mehr Methoden auflösen, bis er einen findet, der die Ausnahme abfangen kann, oder bis er den Anfang des Stapels erreicht, an dem der unbehandelte Ausnahmehandler sein wird namens.

Es scheint Konvention zu sein, im Falle der Ausnahmebehandlung nur den Begriff Stackabwickeln 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.

Verwandte Themen