2010-04-09 8 views
8

C++ appelle automagiquement les destructeurs de toutes les variables locales du bloc dans l'ordre inverse, que le bloc soit quitté normalement (le contrôle tombe) ou qu'une exception soit levée.Comment détruit les variables locales quand un bloc est normalement fermé appelé en C++?

On dirait que le terme stack unwinding ne s'applique qu'à ce dernier. Comment s'appelle le premier processus (la sortie normale du bloc) concernant la destruction des variables locales?

+1

Il ne s'appelle vraiment rien. Partout dans la norme, il dit des choses comme "... les variables automatiques sont détruites à la fin du bloc". Il ne donne jamais un nom à ce processus. – GManNickG

+0

@GMan - Save the Unicorns: Je suppose que vous pourriez ajouter ceci comme réponse. Mentionner ce que The Standard dit est un argument fort. – sharptooth

Répondre

5

Un objet est automatiquement détruit lorsqu'il "sort de sa portée". Cela pourrait être appelé "récupération automatique du stockage", mais cela fait référence à la collecte des ordures (il y a plusieurs papiers avec cette expression dans leur nom qui utilisent le terme pour signifier la collecte des ordures). Quand il est utilisé pour assurer l'appariement approprié d'ouverture/fermeture, verrouillage/déverrouillage, ou d'autres formes d'acquisition de ressources avec leur libération appropriée, alors il est connu comme le modèle de conception de Resource Acquisition is Initialization (RAII), ce qui est quelque peu ironique étant donné que l'aspect principal de RAII Ce n'est pas l'initialisation ou l'acquisition de la ressource, mais plutôt sa destruction.

2

La variable locale est détruite lorsqu'elle est hors de portée. Peut-être que le processus est appelé comme "sortir du cadre"?

1

Je ne suis pas sûr qu'il y ait un nom pour cela. Les variables de pile sont donc automatique que personne ne s'inquiète à leur sujet, jamais, même pas assez pour donner un nom à ce processus de nettoyage automatique. Appelez ça «hors de portée», je suppose.

1

Je l'ai toujours entendu dire "sortir du cadre" ou plus précisément "une variable auto hors de portée".

1

Si ce que vous vous demandez comment l'appel de méthode est effectivement mis en œuvre dans le code de la machine, je dirais que cela dépend de la convention d'appel utilisé

3

déroulage Stack qui se passe dans ces deux cas, il est juste que dans des conditions normales l'exécution de la pile n'est déroulée que dans le contexte de la méthode appelante (ou du bloc) lorsque la méthode d'exécution retourne (ou que le bloc est quitté). Les variables locales sont allouées sur la pile, elles sont donc nettoyées dans l'ordre inverse de l'allocation, et c'est ce processus qui est appelé déroulement. Ce n'est pas différent du traitement de tout autre type de données que vous stockez dans une structure LIFO - par ex. défaire refaire. Lorsqu'une exception est levée, le gestionnaire va dérouler la pile via zéro ou plusieurs méthodes jusqu'à ce qu'elle en trouve une qui peut attraper l'exception, ou jusqu'à ce qu'elle atteigne le sommet de la pile, point auquel le gestionnaire d'exceptions non gérées sera appelé.

Il semble conventionnel de n'utiliser le terme de déroulement de pile que dans le cas de la gestion des exceptions, mais c'est le même processus qui se produit dans chacun de ces cas. Le cas spécifique où la pile se déroule en raison de la sortie d'une méthode est appelé return, il ne semble pas y avoir de convention pour nommer ce qui se passe lorsqu'un bloc de code tronqué est quitté.

Questions connexes