Existe-t-il un ordre défini dans lequel les variables locales sont désallouées en C++ (11)? Pour être plus concis: dans quel ordre les effets secondaires des destructeurs de deux variables locales de même portée deviendront-ils visibles?
par exemple.:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
Est x1
ou x2
détruit en premier lorsque main revient ou l'ordre n'est-il pas défini en C++ 11?
Dans chaque catégorie de classes de stockage (à l'exception des objets alloués dynamiquement), les objets sont détruits dans l'ordre inverse de la construction.
I. À propos des variables locales
Les variables locales sont allouées sur le Stack.
Le Stack est basé sur un modèle LIFO
(Last-In-First-Out
).
Les variables sont donc détruites et désallouées dans l'ordre inverse de l'allocation et de la construction.
II. À propos de votre exemple
Votre fonction main()
s'appelle:
x1
Est alloué et construit sur le Stack,x2
Est alloué et construit sur le Stacket lorsque la fin de l'étendue de la fonction main()
est atteinte:
x2
Est détruit et désalloué de la Stack,x1
Est détruit et désalloué de la StackIII. De plus
Le Stack ressemble à ceci:
(Comportement du Stack semble plus compréhensible avec un schéma)
Il s'agit d'un comportement Stack Data Structure
, Donc les variables locales stockent dans Stack en tant que structure de données LIFO (Last-In-First-Out)
, vous pouvez imaginer que dans une structure de données LIFO, la dernière variable ajouté à la structure doit être le premier à être supprimé. Les variables sont removed
de la pile dans le reverse order
dans l'ordre de leur ajout.
Ils sont détruits dans l'ordre d'allocation inverse, voir this SO question . Dans ce cas, cela signifie que x2
sera détruit avant x1
.
Ils seront détruits suivant un ordre inverse de leur construction.
https://isocpp.org/wiki/faq/dtors#order-dtors-for-locals
isocpp.org a un FAQ sur ce sujet et il dit qu'il le fait dans un ordre inverse . Je pense que le le site officiel n'existait pas quand cette question originale avait été posée.