Probleme avec operateur delete!

Signaler
Messages postés
17
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
22 avril 2004
-
Messages postés
17
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
22 avril 2004
-
Bonjour a tous,

J'ai une fonction qui construit un arbre de positions...
donc en gros je declare un :
Tree *tree= new struct Tree()
ensuite je le remplis, et pour le vider je fais appel a une fonction recursive que j'ai créée. La voici :

int Board::DeleteTree(struct Tree* tree)
{
if (tree!=NULL){
if (tree->Next!=NULL){
DeleteTree(tree->Next);
}
//delete sons
if (tree->Son!=NULL)
DeleteTree(tree->Son);
delete [] tree;
}
return 0;
}

Seulement... le delete fait bien peter les pointeurs... mais tout est toujours dans la pile si bien que ma memoire sature vite!!
Je vois vraiment pas la raison de ce probleme alors si qqun a une bonne idée a me suggerer je suis preneur ;)

Merci
WhiteSpi

10 réponses

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
oubli pas les typedef implicite en c++
Tree *tree= new Tree();

pour liberer

delete tree; et pas delete [] tree;

ne jamais melanger new/delete et new[]/delete[]
Messages postés
17
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
22 avril 2004

Ouais ok merci...
en fait a la base ct delete Tree mais comme ca marchait pas g tout essayé.. dont les crochets pour etre sur et j'avais oublié de les enlever.
Sinon pour ton autre remarque... ben c oci du au fait ke j'ai modifié ;)

Mais bon, cela dit ca suffit pas ca ne libere pas... je ne sais pas pourkoi..
merci kan meme

WhiteSpi
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ben ca a l'air juste ta fonction, faudrait que tu verifi les destructeurs qui vont etre appeler lors du delete (ceux des objet stocker par ex) pour voir si yen a pas un qui fait mal son boulot
Messages postés
17
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
22 avril 2004

Ouais mais a part que ce sont des structures en réalités que j'initialise comme ca... donc elles nt pas de destructeur...
Alors je me demande... a la limite ai-je le droit d'initialiser une structure a l'aide d'un new plutot qu'un malloc?
WhiteSpi
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
une structure c'est une classe, donc ca a un destructeur par defaut si tu l'a pas defini, tu n'a pas besoin de le faire si ya pas de pointeur a liberer ou autre

"a la limite ai-je le droit d'initialiser une structure a l'aide d'un new plutot qu'un malloc?"

tu ve dire que tu allouait avec malloc? et apres tu fait delete ?
Messages postés
17
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
22 avril 2004

Non en fait j'alloue avec new().
mais comme je me dis qu'une structure ca appartient au langage C... enfin du mons c'est la que ca vient et qu'a l'origine on utilisait malloc() je me demandais donc juste si j'avais le droit de faire un new mais tu viens de repondre a ma question ;)
Par sontre effetivement j'ai des pointeurs a l'interieur de ma structure et c'est d'ailleur pour ca que je parcours l'arbre recursivement pour supprimer tout les structures pointées les une apres les autres.
Par contre tu dis qu'on peut mettre un destructeur dans une structure mais comment?
voila ma structure:
struct Tree{
int From;
int To;
struct Tree *Next;
struct Tree *Son;
};

WhiteSpi
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
struct Tree{
int From;
int To;
struct Tree *Next;
struct Tree *Son;

Tree()
{
Next=new Tree();
Son=new Tree();
}

~Tree()
{
delete Next;
delete Son;
}

};

attention c'est juste un exemple, ca correspond peut etre pas a ton probleme vu que comme tu dit tu fait tes delete recursivement

c'est juste pour dire que oui struct c'est du c, struct ne signifi rien en c++, c'est un pseudo alias de class qui a ete garder pour la retro compatibilité avec le c

les attribut y sont donc par defaut publique mais on garde le typedef implicite
Messages postés
17
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
22 avril 2004

Ah d'accord je te remercie pour l'info.
Par contre concernant mon probleme je vois pas bien ce que le fait de mettre un detructeur et un constructeur pourrait resoudre...
M'enfin merci pour le tuyau.
Je ne vois vraiment pas d'ou le probleme peut venir... ca semble kan meme bizare que la memoire ne soit pas libérée mais j'ai testé en direct live avec un indicateur d'utilisation memoire et il est clair qu"a la generation de l'arbre une gross quantité de mémoire est requisitionnée... mais malheureusement non libérée!

@+
WhiteSpi
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
tu stok koi dans les noeuds et les feuilles?

tu alloue koi pendant la construction de l'arbre?
Messages postés
17
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
22 avril 2004

Ouais pendant la construction de l'arbre je store juste un entier qui est la position de depart et un entier qui est la position d'arrivée d'une piece.
Que ce soit un noeud ou une feuille c'est pareil ca stocke la meme chose. La seule difference c'est qu'un noeud a un pointeur sur un suivant et un fils alors ke le feuille n'en a pas.
A part ca...
M'enfin je suis en train de me demander si le probleme ne vient pas d'ailleurs... peut qu'il y a un endroit dans mon code ou des pointeurs sont generés et la mémoire alouée qui se perdent quelque part... je ne vois pas d'autre explication....
WhiteSpi