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
A voir également:
- Fonctionnement d'un destructeur en c++
- Fonctionnement processeur - Guide
- Fonctionnement du protocole http - Guide
- Notice de fonctionnement - Guide
- Fonctionnement onedrive - Guide
- Fonctionnement time machine - Guide
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
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
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
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
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
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
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