web-dev-qa-db-fra.com

Ordre de destruction des variables locales C ++

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?

56
gexicide

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.

60
James Kanze

I. À propos des variables locales

  1. Les variables locales sont allouées sur le Stack.

  2. Le Stack est basé sur un modèle LIFO (Last-In-First-Out).

  3. 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 Stack

et 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 Stack

III. De plus

Le Stack ressemble à ceci:

(Comportement du Stack semble plus compréhensible avec un schéma)

Stack scheme

21
Axel Borja

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.

6
Reza Ebrahimi

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.

4
PrisonMonkeys

Ils seront détruits suivant un ordre inverse de leur construction.

2
UmNyobe

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.

0
z3moon