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 :

Libération de mémoire (delete) d'une struct dans une stl list


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 43
    Points
    43
    Par défaut Libération de mémoire (delete) d'une struct dans une stl list
    Bonjour, j'essaie de coder un gestionnaire de cédules à l'aide d'une liste d'événements (heure, valeur).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Objet contenant les informations requises pour les evenements journaliers
    typedef struct timeValue {	
    	int time;
    	bool value;
    } tv;
    J'ajoute mes événements dans la liste en créant des
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    list<tv *> schedule;
    ...
    tv *newTv = new tv();
    schedule.push_front(newTv);
    Cependant, étant donné que je fais des "new", j'imagine qu'il faut que je libère la mémoire avec des "delete" (pas juste faire des "pop" ou "erase" des structures ajoutées à la liste).

    J'avais trouvé un exemple semblable à ceci sur un autre site mais il ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    list<tv *>::iterator itv;
     
    itv = schedule.begin();
    schedule.pop_front();
    delete (*itv); //<------------Plante
    J'aurais besoin d'aide pour comprendre la méthode afin de bien gérer la mémoire de mon code.

    Merci beaucoup !

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    bonjour,

    Si tu as le droit d'utiliser le dernier standard ou boost, je te conseille vivement de stocker des pointeurs intelligents dans ta liste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    list<shared_ptr<tv>> schedule;
    Comme ça, la mémoire sera libérée automatiquement sans que tu aies besoin d'appeler delete.

    Sinon, ton erreur est que tu enlève ton objet de la liste avant d'appeler delete avec un itérateur qui ne pointe plus sur rien de correct (pop_front invalide ton itérateur).
    Tu peux inverser tes lignes pop_front et delete.
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,
    pop_front ne fait que supprimer le pointeur de la liste, si tu veux que l'objet pointé soit lui-aussi supprimé il faut le faire avant de retirer le pointeur. Surtout qu'une fois le pop_front() exécuté le pointeur est définitivement perdu, c'est à dire qu'il n'y a plus aucun moyen d'accéder à l'objet pointé et il y a donc une fuite mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete schedule.front(); // on détruit l'objet pointé
    schedule.pop_front(); // puis on retire le pointeur de la liste
    Maintenant est-ce que tu es certain d'avoir réellement besoin d'utiliser une liste de pointeur ? (list<tv *>). Dans de nombreux cas une liste d'objet (list<tv>) suffit largement et alors il n'y a plus besoin de gérer manuellement la durée de vie de l'objet.

  4. #4
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Je pense que cela passera mieux en faisant le delete avant de faire pop_front.
    Sinon en utilisant les algorithmes tu peux faire un delete sur tous tes objets :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    //#include <algorithm>
    template<typename T>
    void fonctionDelete<T *p>
    {
      delete p;
    }
     
    {
      /*
      ...
      */
     
      std::for_each(schedule.begin(), schedule.end(), &fonctionDelete<tv>);
      schedule.clear();
    }

    [EDIT] : grillé

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 47
    Points : 43
    Points
    43
    Par défaut
    Merci à tous pour vos réponses.

    J'ai remplacé mes lignes par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete *schedule.begin();
    schedule.erase(schedule.begin()); //Pourrait être remplacé par un pop_front() j'imagine...
    Niark13 : Merci pour le shared_ptr, je vais essayer ça et voir ce que ça donne, très bon truc.

    saad.hessane : Si jamais j'ai des problèmes avec les shared_ptr je vais utiliser ta fonction afin de vider ma liste. Merci !

    EDIT : J'ai vérifié pour le "shared_ptr"...ça prend la librairie boost (je n'avais pas très bien saisi...). Étant donné que mon programme va sur de l'embarqué j'aime mieux inclure le moins de librairies possibles (puisqu'il faut que je trouve une version de la librairie et que je la compile pour la sorte de processeur que j'utilise...). Je vais néanmoins prendre cette librairie en note car elle semble très intéressante.

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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