Faire un delete sur un object déjà détruit fait planter l'application

Résolu
Makazasky
Messages postés
6
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
26 janvier 2009
- 26 janv. 2009 à 04:21
cosmobob
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
- 26 janv. 2009 à 19:01
Quelqu'un à une solution?

7 réponses

cosmobob
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
26 janv. 2009 à 19:01
salut
c'est typiquement un problème dont tu peux te débarrasser définitivement avec le code que je viens de publier, utilisation d'une classe de smart pointer
tu aurais
smart_ptr pB = new B;
smart_ptr p2B = pB;

ça ne sera bien désalloué qu'une seule fois

essaie d'aller voir ici : smart_ptr

++
3
Makazasky
Messages postés
6
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
26 janvier 2009

26 janv. 2009 à 05:32
Jvais donner plus d'infos.... J'ai une classe (A) ayant un pointeur vers un objet d'une autre classe (B), cette objet sera nécessairement créer avec l'opérateur new, et la seule référence vers cette object provient de la classe A ... donc dans le destructeur de la classe A, je détruit l'objet B.

Tout fonctionne bien sauf lorsque j'utilise 2 objet A and que je décide que ces 2 objet A utiliserons le même objet B.
Le premier object A sera détrui correctement, par contre, le second non : le destructeur tentera de faire un delete sur un objet déja détruit (l'objet B).

Le problème c que ca fait carrément planter le programme... y a t-il une facon de vérifier si l'object est valide avant de faire un delete.... ou tout simplement de faire un sorte que le programme plante pas...
0
gnairod
Messages postés
37
Date d'inscription
samedi 22 novembre 2008
Statut
Membre
Dernière intervention
11 avril 2010

26 janv. 2009 à 07:01
Dans ton destructeur.

if (b) {
   delete b;
   b = NULL;
} else {
   // Deja libere
}
0
coucou747
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Membre
Dernière intervention
30 juillet 2012
41
26 janv. 2009 à 07:59
salut

la solution de gnairod fonctionne, mais c'est cacher le fait que tu "essaies" de liberer deux fois ton pointeur, donc c'est cacher une erreur...

sous linux, tu peux utiliser valgrind pour voir beaucoup d'erreurs de gestion de la memoire, c'est tres utile pour enlever ce genre de bugs.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Makazasky
Messages postés
6
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
26 janvier 2009

26 janv. 2009 à 12:28
gnairod, chaque objet A à son propre pointeur sur l'objet B... donc ca ne marche pas.
0
gnairod
Messages postés
37
Date d'inscription
samedi 22 novembre 2008
Statut
Membre
Dernière intervention
11 avril 2010

26 janv. 2009 à 15:32
L'objet B est unique donc doit fonctionne car chaque objet A pointe forcement sur l'adresse de l'objet B.
0
Makazasky
Messages postés
6
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
26 janvier 2009

26 janv. 2009 à 16:53
oui, une fois que l'objet B sera détruit, il ne sera plus utilisé, sauf par le destructeur.

par exemple:

CObjectA a1;
CObjectB a2;
a1.b = a2.b;
//fin
//'lobjet a2 est supprimer ainsi que son objet b
//l'objet a1 est supprimer ansi que son objet b = plantage
0