IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

mémoire et liste chainée?


Sujet :

C++

  1. #1
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut mémoire et liste chainée?
    Bonjour,

    Comment faire pour libérer la mémoire qui a été allouée (avec new ) pour une liste chainée ?

    Merci

  2. #2
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    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
    XXiemeciel

  3. #3
    Membre habitué Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Points : 177
    Points
    177
    Par défaut
    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 ?

  4. #4
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Objet* obj = new Objet&#40;&#41;;
     
    delete obj;
    tu dois appeler delete sur le pointeur 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
    XXiemeciel

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Points : 121
    Points
    121
    Par défaut
    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 ...


    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*> &#58;&#58; iterator it;
    while &#40;!liste.empty&#40;&#41;&#41; &#123;
    it = listedeT.begin&#40;&#41;;
    T* temp = *it;
    listedeT.erase&#40;it&#41;;
    delete T;
    &#125;;
    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.

  6. #6
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Moi c'est plutôt ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pos = liste.begin&#40;&#41;;
    liste.erase&#40;pos&#41;;
    je mets ça dans une boucle et voila

  7. #7
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    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
    XXiemeciel

  8. #8
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    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??

  9. #9
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    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
    XXiemeciel

  10. #10
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    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...

  11. #11
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    &#123;
    std&#58;&#58;vector<Objet*> vec;
     
    vec.push_back&#40;new Objet&#40;&#41;&#41;;
    &#125;
    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é.


    XXiemeciel
    XXiemeciel

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par xxiemeciel
    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.
    Tu ne fais pas erreur.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #13
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    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
    2
     
    vector<int>MonVecteur
    :
    A ma connaissance les objets sont détruits

  14. #14
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    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.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Points : 121
    Points
    121
    Par défaut
    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) .

  16. #16
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Citation Envoyé par JolyLoic
    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.
    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.

    XXiemeciel
    XXiemeciel

  17. #17
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int a=12;
    int *b = new int&#40;42&#41;;
    vector<int> v;
    v.push_back&#40;&a&#41;;
    v.push_back&#40;b&#41;;
    v.push_back&#40;new int&#40;314&#41;&#41;;
    Ici, à supposer qu'on n'a rien fait d'autre de v :
    - 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];
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  18. #18
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    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
    XXiemeciel

Discussions similaires

  1. Liste chainée en mémoire partagée
    Par drogeek dans le forum C
    Réponses: 2
    Dernier message: 21/05/2013, 08h13
  2. Listes Chainées et libération mémoire?
    Par alexglvr dans le forum Débuter
    Réponses: 16
    Dernier message: 19/01/2011, 13h14
  3. Liste chainé et fuite mémoire
    Par poussinphp dans le forum C++
    Réponses: 2
    Dernier message: 26/04/2007, 00h06
  4. Réponses: 24
    Dernier message: 30/10/2005, 10h27
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 21h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo