Fonctionnement d'un destructeur en c++

pom -  
 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
A voir également:

6 réponses

Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   495
 
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
0
vieri9
 
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
0
vieri9
 
jai dit de la merde, sorry. Javais mal compris, le destructeur de A agira seul sans que tu ne lappelles.
0
Kermitt31 Messages postés 3679 Date d'inscription   Statut Contributeur Dernière intervention   495
 
mouais.. pas tres clair vieiri... mais je crois qu'au fond, on est d'accord !
0
pom
 
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
0
damien
 
Salut,

Une bonne hygiene de programmation sera ta meilleure alliée, bien se demander à chaque new ou se fait le delete.
Sinon un certain nombre d'outils peuvent t'aider:

Windows: memproff, memorySleuth
Linux: ccmalloc, NJAMD, YAMD, Valgrind, mpatrol, Insure++...

A+
Damien
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
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
0
pom
 
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
0
Utilisateur anonyme > 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
0
fggggggg
 
appelle de constructeur
0