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

SL & STL C++ Discussion :

Effacer et détruire une std::list de pointeurs sur une structure


Sujet :

SL & STL C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 43
    Points : 33
    Points
    33
    Par défaut Effacer et détruire une std::list de pointeurs sur une structure
    Bonjour,

    Je cherche le moyen de supprimer les éléments d'une std::list et de libérer la mémoire associée.
    J'ai testé plusieurs moyens mais la mémoire n'est jamais libérée.
    La structure utilisée contient des membres de type WCHAR de taille fixe.
    Je travaille sur Windows CE 5.0

    Code : 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
    17
     
    MASTRUCTURE * test3 ;
    std::list<MASTRUCTURE *> test2;
     
    for(int i = 0 ; i!= 1000 ;++i)
    {
    	test3 = new MASTRUCTURE ();
    	test2.push_back(test3);				
    }
     
     
    std::list<MASTRUCTURE *>::iterator itDeb1 = test2.begin();
    while (itDeb1 != test2.end ())
    {
        delete (*itDeb1);
        itDeb1 = test2.erase (itDeb1);
    }
    Merci d'avance,
    Antoine

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 127
    Points : 33 038
    Points
    33 038
    Billets dans le blog
    4
    Par défaut
    Salut,

    faut simplement la parcourir et faire un delete sur chaque élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (!list.empty()) { delete list.back(); list.pop_back(); }
    Après bien sur faut que le detructeur libère correctement son objet.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 136
    Points
    23 136
    Par défaut
    Bonjour,

    Ton code originel devrait normalement fonctionner, il faudrait nous montrer ta structure ainsi que son destructeur.

    Mais je te conseille de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::list<MASTRUCTURE *>::iterator it = test2.begin();
    
    for ( ; it != test2.end() ; ++it ) // ou std::for_each
    // for(auto & ptr : test2) // en C++11
    {
            delete (*it);
            //delete(ptr); //C++11
    }
    
    test2.clear();

    Pour construire ta liste, tu peux aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::list<MASTRUCTURE *> test2(1000, nullptr);
    
    std::list<MASTRUCTURE *>::iterator it = test2.begin();
    
    for ( ; it != test2.end() ; ++it ) // ou std::for_each
    // for(auto & ptr : test2) // en C++11
    {
            *it = new MASTRUCTURE();
            //ptr = new MASTRUCTURE(); //C++11
    }
    Je trouve que le code sera plus "clair".

    A noter qu'en C++11 on utilisera sûrement une liste de std::shared_ptr ou des std::unique_ptr.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2011
    Messages : 43
    Points : 33
    Points
    33
    Par défaut Réponse
    Tout d'abord, merci d'avoir répondu.

    Citation Envoyé par Bousk Voir le message
    Salut,faut simplement la parcourir et faire un delete sur chaque élément.
    C'est ce que je fais.

    Citation Envoyé par Bousk Voir le message
    Après bien sur faut que le destructeur libère correctement son objet.
    Ton code originel devrait normalement fonctionner, il faudrait nous montrer ta structure ainsi que son destructeur.
    Un destructeur pour la structure ?
    J'ai testé en utilisant des float (sans pointeurs) dans la liste et le résultat est équivalent : la mémoire n'est pas libérée.
    Même en utilisant : remove, clear, pop_back, erase, delete..... et j'en passe.

    Antoine

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 127
    Points : 33 038
    Points
    33 038
    Billets dans le blog
    4
    Par défaut
    La list est un contenair, elle n'est pas responsable de ce que t'y mets. L'éventuelle mémoire allouée pour les éléments est de ta responsabilité, à fortiori la mémoire allouée par chaque élément.

Discussions similaires

  1. Réponses: 14
    Dernier message: 31/08/2010, 11h25
  2. DHCP sur une @IP 1 et DNS sur une @IP 2
    Par polls dans le forum Réseau
    Réponses: 1
    Dernier message: 20/08/2010, 12h27
  3. [XL-2002] Ecouter un evenement sur une cellule et le reproduire sur une autre cellule
    Par kulnae dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 17/08/2009, 21h21
  4. Réponses: 5
    Dernier message: 23/09/2008, 13h29
  5. Réponses: 9
    Dernier message: 25/10/2007, 16h20

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