Faire un delete sur un object déjà détruit fait planter l'application [Résolu]

Signaler
Messages postés
6
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
26 janvier 2009
-
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
Quelqu'un à une solution?

7 réponses

Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
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

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

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...
Messages postés
37
Date d'inscription
samedi 22 novembre 2008
Statut
Membre
Dernière intervention
11 avril 2010

Dans ton destructeur.

if (b) {
   delete b;
   b = NULL;
} else {
   // Deja libere
}
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
40
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.
Messages postés
6
Date d'inscription
dimanche 25 janvier 2009
Statut
Membre
Dernière intervention
26 janvier 2009

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

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

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