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

Makazasky 6 Messages postés dimanche 25 janvier 2009Date d'inscription 26 janvier 2009 Dernière intervention - 26 janv. 2009 à 04:21 - Dernière réponse : cosmobob 706 Messages postés mardi 30 décembre 2003Date d'inscription 27 janvier 2009 Dernière intervention
- 26 janv. 2009 à 19:01
Quelqu'un à une solution?
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
cosmobob 706 Messages postés mardi 30 décembre 2003Date d'inscription 27 janvier 2009 Dernière intervention - 26 janv. 2009 à 19:01
3
Merci
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

++

Merci cosmobob 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 124 internautes ce mois-ci

Commenter la réponse de cosmobob
Makazasky 6 Messages postés dimanche 25 janvier 2009Date d'inscription 26 janvier 2009 Dernière intervention - 26 janv. 2009 à 05:32
0
Merci
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...
Commenter la réponse de Makazasky
gnairod 37 Messages postés samedi 22 novembre 2008Date d'inscription 11 avril 2010 Dernière intervention - 26 janv. 2009 à 07:01
0
Merci
Dans ton destructeur.

if (b) {
   delete b;
   b = NULL;
} else {
   // Deja libere
}
Commenter la réponse de gnairod
coucou747 12336 Messages postés mardi 10 février 2004Date d'inscription 30 juillet 2012 Dernière intervention - 26 janv. 2009 à 07:59
0
Merci
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.
Commenter la réponse de coucou747
Makazasky 6 Messages postés dimanche 25 janvier 2009Date d'inscription 26 janvier 2009 Dernière intervention - 26 janv. 2009 à 12:28
0
Merci
gnairod, chaque objet A à son propre pointeur sur l'objet B... donc ca ne marche pas.
Commenter la réponse de Makazasky
gnairod 37 Messages postés samedi 22 novembre 2008Date d'inscription 11 avril 2010 Dernière intervention - 26 janv. 2009 à 15:32
0
Merci
L'objet B est unique donc doit fonctionne car chaque objet A pointe forcement sur l'adresse de l'objet B.
Commenter la réponse de gnairod
Makazasky 6 Messages postés dimanche 25 janvier 2009Date d'inscription 26 janvier 2009 Dernière intervention - 26 janv. 2009 à 16:53
0
Merci
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
Commenter la réponse de Makazasky

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.