Heim >Backend-Entwicklung >C++ >Überspringt „goto' Destruktoraufrufe in C?

Überspringt „goto' Destruktoraufrufe in C?

Barbara Streisand
Barbara StreisandOriginal
2024-11-26 12:24:08383Durchsuche

Does `goto` Skip Destructor Calls in C  ?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn