Maison > développement back-end > C++ > Est-ce que `goto` contourne l'exécution du destructeur en C ?

Est-ce que `goto` contourne l'exécution du destructeur en C ?

Linda Hamilton
Libérer: 2024-12-01 04:52:14
original
893 Les gens l'ont consulté

Does `goto` Bypass Destructor Execution in C  ?

Goto peut-il parcourir des fonctions sans invoquer de destructeurs ?

Une idée fausse courante persiste selon laquelle goto ignore des sections de code, évitant ainsi l'exécution de destructeurs et autres opérations. Cette méprise est particulièrement prononcée dans les discussions autour du C.

Restrictions de portée

Contrairement à la croyance populaire, goto ne peut pas traverser les limites des fonctions. Tenter d'accéder à une étiquette définie dans une fonction différente entraîne une erreur du compilateur, comme illustré ci-dessous :

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

int main() {
   f();
lol:
   return 0;
}
Copier après la connexion

Erreur : l'étiquette 'lol' utilisée mais non définie

Objet Considérations sur l'initialisation

Le saut à travers l'initialisation d'un objet est également interdit. Si vous tentez d'ignorer l'initialisation d'un objet, le compilateur signalera une erreur :

int main() {
   goto lol;
   int x = 0;
lol:
   return 0;
}
Copier après la connexion

Erreur : passer à l'étiquette 'lol'
Erreur : à partir d'ici
Erreur : croise l'initialisation de 'int x'

Spécifique à la portée Destruction

Les objets avec durée de stockage automatique sont détruits à la sortie de leur portée, quelle que soit la méthode de sortie. Goto ne peut donc pas contourner la destruction d'objet :

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

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

lol:
   return 0;
}
Copier après la connexion

Sortie : *T~T

Restrictions de type d'objet

En sautant dans la portée d'objets non scalaires est généralement interdit, il existe des exceptions pour les objets avec des constructeurs et destructeurs par défaut triviaux. Les déclarations de tableau sans initialiseurs sont également exemptées.

Conclusion

Goto, bien qu'il ne s'agisse pas d'une faille qui contourne les mécanismes de portée de C, peut provoquer un comportement imprévu s'il est utilisé avec négligence. Néanmoins, les restrictions décrites ci-dessus fournissent des garanties contre une utilisation involontaire ou nuisible de Goto. Par conséquent, ce n’est pas intrinsèquement mauvais comme on le perçoit généralement, mais doit être appliqué avec discrétion.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal