Bonjour,
Comment faire pour libérer la mémoire qui a été allouée (avec new ) pour une liste chainée ?
Merci
Bonjour,
Comment faire pour libérer la mémoire qui a été allouée (avec new ) pour une liste chainée ?
Merci
Utilises tu std::list<T> ou bien une liste que tu as fait toi meme ? a priorie tu dois parcourir ta liste et faire delete sur chaque element pour liberer ta memoire, si tu detruis ta liste sans faire ca tu auras un memory leak.
XXiemeciel
Oui c'est une liste que j'ai fait moi-même.
En fait je ne sais pas trop comment parcourir la liste
pour effacer chaque élément.
Par exemple pour un parcour simple de la liste:
while(!liste)
{
liste->suivant;
liste = liste->suivant;
}
ou est ce que je dois mettre le delete ?
Ok ,
Donc le delete s'appelle sur un pointeur, en l'occurence le pointeur qio a l'adresse qui a été retourné par le new.
donc si tu fais :
tu dois appeler delete sur le pointeur obj.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Objet* obj = new Objet(); delete obj;
Maintenant tu as probablement stocké ton pointeur quelquepart dans ta liste et je ne peux pas t'aider plus sans connaitre la structure de cette liste.
XXiemeciel
voici le code que j'utilise traditionnellement pour effacer une liste de pointeurs.
Je te rappelle qu'il y a aussi une solution proposée aussi dans la FAQ ...
Tu peux l'adapter à ton conteneur, par exemple en créant un pointeur du type T pointant sur le premier élément de ton tableau.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 list<T*> listedeT; // On suppose que tu l'as remplie list<T*> :: iterator it; while (!liste.empty()) { it = listedeT.begin(); T* temp = *it; listedeT.erase(it); delete T; };
Moi c'est plutôt ça:
je mets ça dans une boucle et voila
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 pos = liste.begin(); liste.erase(pos);
Salut reggae,
si ma memoire est bonne erase ne delete pas tes objets il se contente de les enlever de ta liste.
si tu fais juste ça tu vas te retrouver avec un gros memory leak. La solution de Kaktus me parait plus approprié.
XXiemeciel
Ok merci pour l'info!
Mais l'espace nécessaire pour les éléments de la list n'est-il pas libéré à la fin de l'exécution du prog??
Quand tu detruis ta liste tu detruit ton objet liste mais tu ne detruit pas les objets qu'il contient.
a priori ce n'est pas le role de tes containeur de gerer ta memoire. que ce soit une liste un vector ou une map c'est a toi de faire le new et a toi de faire le delete.
Maintenant rien ne t'empeche de creer ta propre liste qui appelle delete sur tout ses pointeurs a sa propre destruction mais ceci peut etre dangereux.
XXiemeciel
Tu m'en apprends des choses!
On ne m'a JAMAIS dit qu'il fallait utiliser un delete avec les vecteurs...!
On m'a toujours laissé sous-entendre que les objets contenus dans les vecteurs étaient détruits à la fin du prog...
sauf erreur de ma part (Si je me trompe que quelqu'un intervienne svp) il faut deleter les element d'un vector si ce sont des pointeur alloué avec new.
dans le cas suivant :
ben en sortant des {} vec est detruit puisqu'il est alloué sur le stack mais Objet va squatter ta memoire, il ne sera jamais effacé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 { std::vector<Objet*> vec; vec.push_back(new Objet()); }
XXiemeciel
Tu ne fais pas erreur.Envoyé par xxiemeciel
Ok! Merci! Pour les pointeurs ça me semble logique.
Mais quant est-il pour cela:
:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2vector<int>MonVecteur
A ma connaissance les objets sont détruits
Oui
Un vecteur détruit les objets qu'il contient. Dans le cas où ce sont des pointeurs, il détruit bien ces pointeurs. Mais pas les objets sur lesquels ces pointeurs pointent.
Une autre idée est aussi d'utiliser de smart pointeurs qui sous certaines conditions d'utilisation (notamment pas d'affectation circulaires) font le travail à ta place pour un coût moindre.
La librairie boost en propose (cf FAQ) .
Je trouve ton poste porte a confusion, il ne faut pas que quelqu'un pense en lisant ça qu'il ne doit pas faire le delete.Envoyé par JolyLoic
XXiemeciel
Je suis désolé si mon post peut être mal compris. Il me semblait plus exact, et montrait que ce qui pouvait paraître un cas particulier n'en était pas un. En effet, dans les posts précédents, on pouvait lire (je résume, déforme et oriente) :
"Si c'est un vector<int>, pas besoin de delete, mais un vector<int*>, c'est nécessaire."
Mon propos était de dire que dans les deux cas, il se passe la même chose, les éléments du vecteur sont détruits tout seul. Par contre, dans le deuxième cas, on a aussi construit des choses en dehors du vecteur, et il faut les gérer aussi, et éventuellement les détruire.
Je dis éventuellement, car même avec un vector<int*>, un delete n'est pas forcément nécessaire, on se retrouve dans le cas de base des pointeurs.
Ici, à supposer qu'on n'a rien fait d'autre de v :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int a=12; int *b = new int(42); vector<int> v; v.push_back(&a); v.push_back(b); v.push_back(new int(314));
- Il ne faut pas faire un delete vector[0];
- On ne peut pas dire avec les éléments présentés s'il faut ou non faire un delete vector[1]; ça dépend si on fait un delete b;
- Il faut faire un delete vector[2];
D'accord,
je comprend ce que tu voulais dire, mais je pensais plus a des objets qu'a des types de base dans mon explication.
XXiemeciel
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager