Bonjour,

J'ai un petit soucis pour libérer des pointeurs de classe ayant les dépendances suivantes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
*** glibc detected *** /home/projet: free(): invalid pointer: 0x028d