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; }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
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; }
J'obtiens une erreur au moment de l'instruction
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(); }dans ma méthode de libération de ressource.
Code : Sélectionner tout - Visualiser dans une fenêtre à part delete classeB;
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 :
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
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; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 *** glibc detected *** /home/projet: free(): invalid pointer: 0x028d
Partager