Problème avec delete [Résolu]

Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
- - Dernière réponse : cs_juju12
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
- 19 mai 2006 à 13:11
Bonjour;
   L'extrait de code suivant(simplifié bien sûr) me cause problème :

class Class1
{
};



int main(void)
{
 Class1 n=*(new Class1);
 delete &n;
 return 0;
}


La compilation est OK par contre l'exécution (en debug) me renvoie :
"Debug Assertion Failed [...] _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)"

Je ne comprend absolument pas...

Merci de votre aide;
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
1
3
Merci
Oui, c'est normal, l'opérateur = effectue une copie membre à membre, a la première ligne
T a, b;
tu créer 2 objets de type T avec chacun un pointeur sur un tableau de 10 éléments que tu a alloué dans le constructeur.
Mais ensuite quand tu faits a=b, dans ton objet a tu perde le pointeur vers le tableau alloué à la construction de a puisque maintenant tu as dans a un poiteur vers le tableau de b (puisque égal fait une copie membre à membre).
A la fin du main delete[] est donc appelé deux fois sur le même pointeur et le tableau initiale de l'objet à n'est pas détruit car tu a perdu le pointeur sur celui-ci.
Solution: surcharger l'opérateur = pour que les éléments du tableau soient copié de b vers a est non les pointeurs.

Bonne chance, n'hésites pas à demander précisions si t'as un blem.
Bouba

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 120 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_bouba
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
0
Merci
Class1* n =
new
Class1;

delete n;
Commenter la réponse de ymca2003
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
&n est une adresse sur la pile, c'est donc normal que le delete échoue
En fait, n est une copie de l'objet créé sur le tas, tu ne peux donc pas lui appliquer delete
Commenter la réponse de vecchio56
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
1
0
Merci
 Class1 n=*(new Class1); // Ici tu déréférences, tu récupères "la valeur", l'opérateur = réalise donc une copie membre à membre mais tu perds la référence au pointeur retourné par new !!!
 
delete &n; // Ici en fait cette instruction demande la désallocation de n, mais n n'est pas alloué dynamiquement, en sortant du main le prog essaira de désallouer une fois de plus n, en tout cas ce n'est nullement l'objet "new Class1" qui est pointé par &n !!!

Good Luck.

Bouba
Commenter la réponse de cs_bouba
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
1
0
Merci
Oups, en même temps !!!
Commenter la réponse de cs_bouba
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
0
Merci
Merci pour vos réponses, cela m'a aidé;
Mais j'ai toujours un problème avec delete [] :

class T
{
protected:
 int*Ptr;
public:
 T(){Ptr=new int[10];}
 ~T(){delete [] Ptr;}
};



int main(void)
{
 T a,b;
 a=b;
 return 0;
}

Cela me renvoie la même erreur que précédemment, au niveau de la ligne a=b (lorsque le prog libère l'ancienne ressource de a je suppose);
Commenter la réponse de cs_juju12
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
0
Merci
a=b;

Si tu as des pointeurs dans la classe T, alors juste leurs valeurs est copiés.
Fais une fonction Copy, qui va copier sur quoi pointe le pointeur Ptr.
Commenter la réponse de Zootella
Messages postés
968
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
0
Merci
Zootella-> je sais, c'était juste pour l'exemple (merci tout de même);
bouba-> merci pour tes réponses ça devrait aller maintenant...
Commenter la réponse de cs_juju12