Heim >Backend-Entwicklung >C++ >Umgehen „goto'-Anweisungen Objektdestruktoren in C?
Können „goto“-Anweisungen über Funktionsgrenzen hinweg springen, ohne Destruktoren aufzurufen?
Es wird allgemein angenommen, dass goto-Sprünge die ordnungsgemäße Ausführung von Code umgehen , einschließlich der Zerstörung von Gegenständen. Dies ist jedoch ein Missverständnis, das auf einem Missverständnis der Gültigkeitsbereichsregeln von C beruht.
Umfang von Beschriftungen
Erstens sind Goto-Sprünge auf ihren Gültigkeitsbereich beschränkt jeweiligen Funktionen. Ein Überspringen von Funktionsgrenzen, wie in dem von Ihnen angegebenen Beispiel, ist nicht möglich. Der Compiler gibt einen Fehler aus, der darauf hinweist, dass die Bezeichnung nicht in der Funktion definiert ist, von der der Sprung stammt.
Objektinitialisierung und -bereich
Zweitens können Goto-Sprünge die nicht überschreiten Initialisierung von Objekten. Erfolgt ein Sprung über den Punkt hinaus, an dem ein Objekt deklariert und initialisiert wird, wird der Gültigkeitsbereich des Objekts eingegeben und sein Konstruktor aufgerufen. Wenn jedoch der Sprung zurück in den Bereich eines bereits initialisierten Objekts erfolgt, wird dessen Destruktor aufgerufen, bevor der Sprung ausgeführt wird.
Erhaltung des Objektbereichs
Schließlich Objekte mit automatischer Speicherdauer (d. h. innerhalb von Blöcken deklarierte Variablen) werden durch Goto-Sprünge nicht verloren. Das Verlassen des Gültigkeitsbereichs eines Objekts über ein Goto löst seine Zerstörung aus und stellt sicher, dass die Ressourcenverwaltung korrekt gehandhabt wird.
Fazit
Entgegen der landläufigen Meinung sind Goto-Anweisungen in C nicht zulässig für unkontrollierte Sprünge, die gegen Scoping-Regeln verstoßen oder zu Speicherverlusten führen. Obwohl die Verwendung von goto aus Designgründen weiterhin umstritten ist, birgt sie nicht die inhärenten Risiken, die ihr oft zugeschrieben werden.
Das obige ist der detaillierte Inhalt vonUmgehen „goto'-Anweisungen Objektdestruktoren in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!