Problème avec delete [Résolu]

Signaler
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
-
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
-
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;

8 réponses

Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3
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
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Class1* n =
new
Class1;

delete n;
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
&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
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3
 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
Messages postés
518
Date d'inscription
dimanche 2 décembre 2001
Statut
Membre
Dernière intervention
10 novembre 2007
3
Oups, en même temps !!!
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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);
Messages postés
252
Date d'inscription
vendredi 10 juin 2005
Statut
Membre
Dernière intervention
5 septembre 2006
1
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.
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Zootella-> je sais, c'était juste pour l'exemple (merci tout de même);
bouba-> merci pour tes réponses ça devrait aller maintenant...