Heim > Backend-Entwicklung > C++ > Umgeht „goto' die Destruktorausführung in C?

Umgeht „goto' die Destruktorausführung in C?

Linda Hamilton
Freigeben: 2024-12-01 04:52:14
Original
895 Leute haben es durchsucht

Does `goto` Bypass Destructor Execution in C  ?

Kann Goto Funktionen durchlaufen, ohne Destruktoren aufzurufen?

Ein weit verbreitetes Missverständnis besteht weiterhin, dass Goto Codeabschnitte überspringt und so die Ausführung von Destruktoren und Ähnlichem vermeidet Operationen. Dieses Missverständnis ist in Diskussionen rund um C besonders ausgeprägt.

Bereichseinschränkungen

Entgegen der landläufigen Meinung kann goto Funktionsgrenzen nicht überschreiten. Der Versuch, zu einer Beschriftung zu springen, die in einer anderen Funktion definiert ist, führt zu einem Compilerfehler, wie unten dargestellt:

void f() {
   int x = 0;
   goto lol;
}

int main() {
   f();
lol:
   return 0;
}
Nach dem Login kopieren

Fehler: Beschriftung „lol“ verwendet, aber nicht definiert

Objekt Überlegungen zur Initialisierung

Das Überspringen der Objektinitialisierung ist ebenfalls nicht zulässig. Wenn Sie versuchen, die Initialisierung eines Objekts zu überspringen, meldet der Compiler einen Fehler:

int main() {
   goto lol;
   int x = 0;
lol:
   return 0;
}
Nach dem Login kopieren

Fehler: Zur Bezeichnung „lol“ springen
Fehler: von hier aus
Fehler: Überschreitet die Initialisierung von 'int x'

Bereichsspezifisch Zerstörung

Objekte mit automatischer Speicherdauer werden beim Verlassen ihres Gültigkeitsbereichs zerstört, unabhängig von der Beendigungsmethode. Goto kann daher die Objektzerstörung nicht umgehen:

struct T {
   T() { cout << "*T"; }
  ~T() { cout << "~T"; }
};

int main() {
   {
      T t;
      goto lol;
   }

lol:
   return 0;
}
Nach dem Login kopieren

Ausgabe: *T~T

Objekttypbeschränkungen

Beim Springen in den Bereich von nichtskalaren Objekten ist generell verboten, es gibt Ausnahmen für Objekte mit trivialen Standardkonstruktoren und -destruktoren. Array-Deklarationen ohne Initialisierer sind ebenfalls ausgenommen.

Fazit

Goto ist zwar keine Lücke, die die Scoping-Mechanismen von C umgeht, kann aber bei unachtsamer Verwendung zu unvorhergesehenem Verhalten führen. Dennoch bieten die oben beschriebenen Einschränkungen Schutz vor unbeabsichtigter oder schädlicher Goto-Nutzung. Daher ist es nicht von Natur aus böse, wie allgemein angenommen wird, sondern sollte mit Bedacht angewendet werden.

Das obige ist der detaillierte Inhalt vonUmgeht „goto' die Destruktorausführung in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage