Fonctionnement d'un destructeur en c++

Fermé
pom - 23 juil. 2004 à 10:20
 fggggggg - 28 mai 2010 à 22:57
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 3669 Date d'inscription jeudi 15 juillet 2004 Statut Contributeur Dernière intervention 8 août 2006 497
23 juil. 2004 à 10:39
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
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
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 3669 Date d'inscription jeudi 15 juillet 2004 Statut Contributeur Dernière intervention 8 août 2006 497
23 juil. 2004 à 14:57
mouais.. pas tres clair vieiri... mais je crois qu'au fond, on est d'accord !
0
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
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
24 juil. 2004 à 04:24
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
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
27 juil. 2004 à 17:00
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
appelle de constructeur
0