Wie zerstört man lokale Variablen, wenn ein Block normalerweise in C ++ aufgerufen wird?

8

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 stack unwinding gilt nur für Letzteres. Wie heißt der vorherige Prozess (der normale Ausgang des Blocks) bezüglich der Zerstörung lokaler Variablen?

    
sharptooth 09.04.2010, 05:52
quelle

6 Antworten

5

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.

    
Michael Aaron Safyan 09.04.2010, 05:58
quelle
3

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.

    
Stu Mackellar 09.04.2010 06:37
quelle
2

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?

    
Miroslav Bajtoš 09.04.2010 05:58
quelle
1

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.

    
wilhelmtell 09.04.2010 05:58
quelle
1

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

    
msw 09.04.2010 05:59
quelle
1

Wenn Sie fragen, wie der Methodenaufruf tatsächlich in Maschinencode implementiert wird, würde ich sagen, dass dies von der verwendeten Aufrufkonvention abhängen würde

    
Tullo_x86 09.04.2010 06:22
quelle

Tags und Links