Fonctionnement d'un destructeur en c++
pom
-
fggggggg -
fggggggg -
Bonjour, est-ce que quelqu'un peux mieux m'expliquer le fonctionnement des appels d'un destructeur d'un objet en c++ ?
Voici mon exemple (exemple très académique). J'ai deux classes : A et B.
class A
{
int * m;
int size;
public:
A(int size_) : size(size_) {m=new int[size];}
~A() {if (m != NULL) delete [] m; size=0;}
void destroy() { if(m != NULL) delete [] m; size=0;}
// blabla
};
Maintenant ma classe B contient un element de ma classe A
class B
{
A a;
int r;
public
B(const A & a_,int r_): a(a_), r(r_) {}
// ici il faut faire le destructeur
};
ma question est la suivante (car je veux eviter les fuites de mémoires) :
puis-je faire ~B() {} (donc un destructeur qui ne fait rien) ? C'est-à-dire est-ce que le destructeur de B appelle automatiquement le destructeur de A ?
ou bien dois-je détruire "à la main" l'objet A qui est contenu dans B
~B() { a.destroy(); }
J'espère avoir été clair dans l'explication de mon problème.
Merci
Pom
Voici mon exemple (exemple très académique). J'ai deux classes : A et B.
class A
{
int * m;
int size;
public:
A(int size_) : size(size_) {m=new int[size];}
~A() {if (m != NULL) delete [] m; size=0;}
void destroy() { if(m != NULL) delete [] m; size=0;}
// blabla
};
Maintenant ma classe B contient un element de ma classe A
class B
{
A a;
int r;
public
B(const A & a_,int r_): a(a_), r(r_) {}
// ici il faut faire le destructeur
};
ma question est la suivante (car je veux eviter les fuites de mémoires) :
puis-je faire ~B() {} (donc un destructeur qui ne fait rien) ? C'est-à-dire est-ce que le destructeur de B appelle automatiquement le destructeur de A ?
ou bien dois-je détruire "à la main" l'objet A qui est contenu dans B
~B() { a.destroy(); }
J'espère avoir été clair dans l'explication de mon problème.
Merci
Pom
6 réponses
-
je crois (si mes souvenirs sont bons) que le destructeur de A est appelé automatiquement et tu n'as donc (toujours si mes souvenirs sont bons) pas besoin de coder de destructeur...
Il se demerde tout seul a detruire A grace a son propre destructeur -
si je me souviens bien, les destructeurs sappelleent automatiquement, par exemple quand tu sors d'une fonction secondaire, le destructeur automatique détruit toutes les variables sauf pointeurs sans que tu n'aies qqchose a faire.
pour ta classe A, le destructeur est necessaire car tu utilises un pointeur, pour la classe B cependant, le destructeur est inutile, le destructeur naturel liberera la mémoire allouer seul -
jai dit de la merde, sorry. Javais mal compris, le destructeur de A agira seul sans que tu ne lappelles.
-
ok, merci
donc le destructeur de B appellera celui de A. C'est une bonne chose.
Mais savez-vous si j'ai un moyen pour vérifier s'il y a des fuites de mémoire ?
meric encore.
Pom -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Bonjour,
En mode console, place un ligne du style [ cout << "Premier constructeur en action ! ->" << endl; ] pour chaque constructeur et regarde l'affichage lors de l'appel.
Lupin-
Effectivement, c'est bien la réponse la plus claire. Au moins je serai sûr du résultat. Toujours aussi malin ce Lupin !
Merci
Pom- re :
Tout le plaisirs est pour moi, si cela répond à tes besoins.
En fait, j'ai trouvé cette astuce de façon intuitive lors de
mon dernier cours en VC++, mon habitude est de toujours
créer de petit module et de les tester seul. Petit à petit
je monte mes progs en suivant un algorithme rigoureux.
Amicalement
Lupin
-
-