Problème de libération de pointeurs
Bonjour,
J'ai un petit soucis pour libérer des pointeurs de classe ayant les dépendances suivantes :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
//CLASSE A
//le .h
class ClasseA {
private :
ClasseB * classeB;
ClasseC * classeC;
ClasseD * classeD;
public :
void allouerPointeurs():
void libererPointeurs();
ClasseD * getClasseD();
}
//le .c
void ClasseA::allouerPointeurs()
{
classeB = new classeB(getClasseD());
classeC = new classeC(getClasseD());
}
ClasseD * ClasseA::getClasseD()
{
if(classeD == NULL)
classeD = new ClasseD();
return classeD;
}
void ClasseA::libererPointeurs()
{
if(classeB != NULL)
delete classeB;
if(classeC != NULL)
delete classeC;
if(classeD != NULL)
delete classeD;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
//CLASSE B
//le .h
class ClasseB {
private :
ClasseD * classeD;
public :
ClasseB(ClasseD * classeD);
~ClasseB();
}
//le .c
ClasseB::ClasseB(ClasseD * classeD)
{
this.classeD = classeD;
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
//CLASSE C
//le .h
class ClasseC {
private :
ClasseD * classeD;
public :
ClasseC(ClasseD * classeD);
~ClasseC();
}
//le .c
ClasseC::ClasseC(ClasseD * classeD)
{
this.classeD = classeD;
} |
Quand dans le main j'effectue les appels suivants :
Code:
1 2 3 4 5 6 7 8 9
|
//Un main :
int main()
{
ClasseA classeA;
classeA.allouerPointeurs();
classeA.libererPointeurs();
} |
J'obtiens une erreur au moment de l'instruction dans ma méthode de libération de ressource.
Je pense que le problème vient de ma transmission du pointeur ClasseD * classeD; de la classe A vers les classes B et C. mais je ne vois pas comment y remédier sans repenser totalement les dépendances entre mes classes. J'ai essayé en inversant les instruction de delete :
Code:
1 2 3 4 5 6 7 8 9 10
|
void ClasseA::libererPointeurs()
{
if(classeD != NULL)
delete classeD;
if(classeB != NULL)
delete classeB;
if(classeC != NULL)
delete classeC;
} |
Mais c'est pareil : bug sur la delete de la classe B. Voici le message erreur généré :
Code:
1 2
|
*** glibc detected *** /home/projet: free(): invalid pointer: 0x028d |