Maison  >  Article  >  développement back-end  >  Est-ce que `goto` ignore les appels de destructeur en C ?

Est-ce que `goto` ignore les appels de destructeur en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-26 12:24:08357parcourir

Does `goto` Skip Destructor Calls in C  ?

Goto peut-il sauter à travers le code sans invoquer de destructeurs ?

Question : Est-il vrai que les sauts goto peuvent contourner le code sections sans exécuter destructeurs ?

Exemple : Considérez le code suivant :

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

int main() {
   f();
lol:
   return 0;
}

L'objet x sera-t-il supprimé après le saut goto ?

Réponse :

Non, l'objet x ne sera pas fuite.

Cette croyance est une idée fausse courante. Les sauts goto ne contournent pas les mécanismes de portée de C et les destructeurs sont appelés comme prévu.

1. Portée de l'étiquette :

Les instructions Goto ne peuvent pas franchir les limites des fonctions. La portée d'une étiquette est limitée à la fonction dans laquelle elle est définie.

2. Initialisation de l'objet :

Les sauts Goto ne peuvent pas contourner l'initialisation de l'objet. Tenter de dépasser un objet non initialisé entraînera une erreur du compilateur. De même, revenir en arrière sur un objet initialisé entraînera la destruction de son instance précédente.

3. Portée des objets :

Les objets avec une durée de stockage automatique ne sont pas divulgués lorsqu'un saut goto quitte leur portée. C s'assure que les objets sont détruits dans l'ordre inverse de leur construction à la sortie d'une portée.

Conclusion :

Les sauts Goto respectent pleinement les règles de portée et de destruction de C . Il n'est pas possible d'utiliser goto pour contourner ces mécanismes et provoquer des fuites mémoire. Cependant, il n'est toujours pas recommandé d'utiliser goto de manière excessive car cela peut conduire à un code difficile à comprendre et à maintenir.

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!

Déclaration:
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