Können Goto-Sprünge über den Code hinweg erfolgen, ohne Destruktoren aufzurufen?
Frage: Stimmt es, dass Goto-Sprünge Code umgehen können? Abschnitte ohne Ausführung Destruktoren?
Beispiel:Betrachten Sie den folgenden Code:
void f() { int x = 0; goto lol; } int main() { f(); lol: return 0; }
Wird das Objekt x nach dem Goto-Sprung gelöscht?
Antwort:
Nein, das Objekt x wird es nicht sein durchgesickert.
Dieser Glaube ist ein weit verbreitetes Missverständnis. Goto-Sprünge umgehen nicht die Scoping-Mechanismen von C und Destruktoren werden wie erwartet aufgerufen.
1. Beschriftungsbereich:
Goto-Anweisungen können nicht über Funktionsgrenzen springen. Der Geltungsbereich eines Labels ist auf die Funktion beschränkt, in der es definiert ist.
2. Objektinitialisierung:
Goto-Sprünge können die Objektinitialisierung nicht umgehen. Der Versuch, an einem nicht initialisierten Objekt vorbeizuspringen, führt zu einem Compilerfehler. Ebenso führt das Zurückspringen über ein initialisiertes Objekt zur Zerstörung seiner vorherigen Instanz.
3. Objektbereich:
Objekte mit automatischer Speicherdauer gehen nicht verloren, wenn ein Goto-Sprung ihren Gültigkeitsbereich verlässt. C stellt sicher, dass Objekte beim Verlassen eines Bereichs in der umgekehrten Reihenfolge ihrer Konstruktion zerstört werden.
Schlussfolgerung:
Goto-Sprünge respektieren vollständig die Bereichs- und Zerstörungsregeln von C. Es ist nicht möglich, goto zu verwenden, um diese Mechanismen zu umgehen und Speicherlecks zu verursachen. Es wird jedoch immer noch nicht empfohlen, goto übermäßig zu verwenden, da dies zu Code führen kann, der schwer zu verstehen und zu warten ist.
Das obige ist der detaillierte Inhalt vonÜberspringt „goto' Destruktoraufrufe in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!