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 44
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
Rejoignez-nous