Bonjour, j'ai beaucoup de mal à comprendre l'ordre d'appel des destructeurs pour des objets insérés dans des vecteurs.
Le comportement est limpide quand je stocke des pointeur sur mes objets (je suis responsable explicitement des libérations), mais si je stocke des objets eux même...
Je pensais que lorsque j'instanciais un objet, via
, la durée de vie de l'instance était gérée automatiquement (appel au destructeur lorsque je sors du scope de définition).
Maintenant, j'ai envie de mettre un de mes objets dans un vecteur...Il me semblait que l'appel au destructeur devenait de la résponsabilité du vecteur...Si je retire l'objet, ou si je vide le vecteurs j'imaginais que les destructeurs seraient appellés.
Dans un élan de lucidité, je me décide à tester l'air de rien ce comportement, avant de ravager du vrai code...
Et là c'est le drame.
De mon main, j'appelle une méthode qui instancie 5 objets Truc, et qui les place dans un vecteur.
Les trucs ne sont définis que dans le scope d'une boucle, le vecteur pour toute la fonction.
Je compte bien 5 appels aux constructeurs.
Je compte heu...des tonnes d'appels aux destructeurs...
Alors je vois bien que je m'y prends mal, et que je ferrais mieux de stocker des pointeurs...mais quand même...une ame génereuse pourrait-elle m'expliquer le comportement que j'observe ?
Code :
- #include <iostream>
- #include <vector>
- using namespace std;
- class Truc
- {
- int mi;
- public:
- Truc(int i)
- {
- mi = i;
- cout << "Constructeur " << mi << endl;
- }
- ~Truc(void)
- {
- cout << "Destructeur " << mi << endl;
- }
- };
- void tableau(void)
- {
- cout << endl << "Début Tableau" << endl << endl;
- vector<Truc> vect;
- for (int i=0; i<5; i++)
- {
- cout << i << endl;
- Truc truc(i);
- vect.push_back(truc);
- }
- cout << endl << "Fin Tableau" << endl;
- }
- int main(void)
- {
- tableau();
- cout << endl << "Fini" << endl;
- return 0;
- }
|
Ce que ca fait lorsque c'est executé (Linux, Windows même combat):
Début Tableau
0
Constructeur 0
Destructeur 0
1
Constructeur 1
Destructeur 0
Destructeur 1
2
Constructeur 2
Destructeur 0
Destructeur 1
Destructeur 2
3
Constructeur 3
Destructeur 3
4
Constructeur 4
Destructeur 0
Destructeur 1
Destructeur 2
Destructeur 3
Destructeur 4
Fin Tableau
Destructeur 0
Destructeur 1
Destructeur 2
Destructeur 3
Destructeur 4
Fini
|