154 votes

Ordre des appels de constructeur et de destructeur de membre

Oh gourous C ++, je cherche ta sagesse. Parlez-moi en standard et dites-moi si C ++ garantit que le programme suivant:

 #include <iostream>
using namespace std;

struct A
{
    A() { cout << "A::A" << endl; }
    ~A() { cout << "A::~" << endl; }
};

struct B
{
    B() { cout << "B::B" << endl; }
    ~B() { cout << "B::~" << endl; }
};

struct C
{
    C() { cout << "C::C" << endl; }
    ~C() { cout << "C::~" << endl; }
};

struct Aggregate
{
    A a;
    B b;
    C c;
};

int main()
{
    Aggregate a;
    return 0;
}
 

produira toujours

 A::A
B::B
C::C
C::~
B::~
A::~
 

En d’autres termes, est-il garanti que les membres seront initialisés par ordre de déclaration et détruits dans l’ordre inverse?

166voto

dirkgently Points 56879

En d'autres mots, ce sont les membres de la garanti d'être initialisé par ordre de déclaration et détruit dans l'ordre inverse?

Oui pour les deux. Voir 12.6.2

6 Initialisation doit procéder dans l' ordre suivant:

  • Tout d'abord, et seulement pour le constructeur de la plupart des dérivés classe comme décrit ci-dessous, de base virtuelle les classes doivent être initialisées dans le afin qu'ils apparaissent sur une profondeur d'abord de gauche à droite de la traversée de la graphe dirigé acyclique de base les classes, où "gauche-droite" est l' l'ordre d'apparition de la classe de base les noms dans la classe dérivée la base de spécificateur de liste.

  • Ensuite, direct les classes de base doit être initialisé dans déclaration ordre qu'ils apparaissent dans la base de spécificateur de la liste, indépendamment de la l'ordre de la mem-initialiseurs).

  • Alors, non les données membres statiques sont initialisé dans l'ordre où ils ont été déclaré dans la définition de classe (encore une fois quel que soit l'ordre de la mem-initialiseurs).

  • Enfin, l' composé-déclaration du constructeur le corps est exécuté. [ Note: l' ordre de déclaration est obligatoire s'assurer que la base et membre de la sous-objets sont détruits dans l'ordre inverse de la l'initialisation. -la note de fin ]

30voto

AndreyT Points 139512

Oui, ils le sont (membres non statiques). Voir 12.6.2 / 5 pour l'initialisation (construction) et 12.4 / 6 pour la destruction.

18voto

wilhelmtell Points 25504

Oui, la norme garantit que les objets sont détruits dans l'ordre inverse de leur création. La raison en est qu'un objet peut en utiliser un autre, donc en dépendre. Considérer:

 struct A { };

struct B {
 A &a;
 B(A& a) : a(a) { }
};

int main() {
    A a;
    B b(a);
}
 

Si a devait se détruire avant b alors b contiendrait une référence de membre non valide. En détruisant les objets dans l'ordre inverse de leur création, nous garantissons une destruction correcte.

7voto

Chris Jester-Young Points 102876

Oui et oui. L'ordre de destruction est toujours opposé à l'ordre de construction, pour les variables membres.

-1voto

user272043 Points 59

Les membres seront initialisés dans l'ordre, oui; détruit à l'envers? ne sais pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X