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 :

Conteneur : Suppression d'élément


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Par défaut Conteneur : Suppression d'élément
    Bonjour,

    Je voudrais savoir lorsque je fait un erase ou un remove dans un conteneur de type list (STL) si l'élément est juste effacé du conteneur et existe encore en dehors du conteneur, ou s'il est vraiment effacé pour de bon mémore vidée etc...

    J'ai trouvé ça dans la FAQ :

    Dois-je effacer ce que j'ai stocké dans un vecteur ? [haut]

    auteur : LFE
    La réponse dépend de la nature de ce qui est stocké dans un vecteur.
    S'il s'agit d'un objet, il n'est pas utile de le détruire, il le sera lorsqu'il est retiré du vecteur, ou lorsque le vecteur est détruit.
    Par contre, s'il s'agit d'un pointeur sur un objet, il faut le détruire car un pointeur n'est pas un objet. Si cette destruction n'est pas faite, le programme présentera une fuite de mémoire.
    Dans mon cas je pense qu' "il s'agit d'un pointeur sur un objet" mais alors je ne sait pas comment effacer "proprement" un élément.

    Voici mon code :

    Une liste d'objet->
    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
     
     
    using namespace std;
    #include <list>
     
    class Triangle
    {
     
        public :
     
        Vecteur *v[3];
        Triangle();
    };
     
    typedef list<Triangle*>           l_Triangle;
    Et un itérateur pour les parcourrir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
        l_Triangle::iterator i_Tri = Liste->begin();
        while (i_Tri != Liste->end())
        {  
     
        i_Tri++;
        }
    bon le truc c'est que si je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
        l_Triangle::iterator i_Tri = Liste->begin();
        while (i_Tri != Liste->end())
        {  
     
        delete i_Tri;
        i_Tri = NULL;
     
        i_Tri++;
        }
    Ca bugge et je sais pourquoi (je détruit mon itérateur donc le i_Tri++ plante
    puisque je peux pas ajouter 1 à un itérateur qu n'existe plus)
    Je sais pas comment faire pour supprimer un ou plusieur éléments de ma liste sans fuite de mémoire.

    j'ai trouvé ca dans la FAQ mais je sais pas m'en servir:

    Exemple] Comment détruire les pointeurs d'un conteneur ? [haut]

    auteur : Laurent Gomila
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #include <list> 
    #include <algorithm>
     
    // Foncteur servant à libérer un pointeur - applicable à n'importe quel type
    struct Delete 
    { 
       template <class T> void operator ()(T*& p) const 
       { 
          delete p;
          p = NULL;
       } 
    }; 
     
    int main() 
    { 
       // Création d'une liste de pointeurs 
       std::list<int*> l; 
       l.push_back(new int(5)); 
       l.push_back(new int(0)); 
       l.push_back(new int(1)); 
       l.push_back(new int(6)); 
     
       // Destruction de la liste : attention il faut bien libérer les pointeurs avant la liste ! 
       std::for_each(l.begin(), l.end(), Delete()); 
     
       return 0;
    Merci
    MProg

    Merci d'essayer de ne pas confondre QUOTE et CODE koala01

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete i_Tri;
    i_Tri = NULL;
    i_Tri est un itérateur, ce n'est pas lui qu'il faut détruire et mettre à NULL, mais l'élément qu'il désigne. D'ailleurs ça m'étonne que ce code compile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete *i_Tri;
    *i_Tri = NULL;
    En plus ce code ne sera pas suffisant si tu veux retirer l'élément du conteneur, là tu n'as fait que détruire l'objet et désallouer la mémoire, mais le pointeur est toujours dans la liste.

    Jette un oeil à ceci :
    http://cpp.developpez.com/faq/cpp/?p...ssion_elements

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Par défaut
    Ok, merci donc si je fait un remove ou erase et aprés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    delete *i_Tri;
    *i_Tri = NULL;
    Mon code sera propre ?

    Merci
    MProg

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Juste pour info, il existe dans Boost un conteneur exprès pour les pointeurs : http://www.boost.org/libs/ptr_contai...container.html
    (c'est un conteneur intelligent)

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par MProg Voir le message
    Ok, merci donc si je fait un remove ou erase et aprés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    delete *i_Tri;
    *i_Tri = NULL;
    Mon code sera propre ?

    Merci
    MProg
    Surtout pas!
    Il faut d'abord supprimer l'élément par un
    Puis il faut retirer ce pointeur de la list:

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Par défaut
    Ok, donc si je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    l_Vecteur::iterator i_Vect = svList->begin();
    delete *i_Vect; 
    svList->remove(*i_Vect);
    *i_Vect=NULL;
    C'est une bonne façon pour effacer un élément de ma liste
    Mais mon objectif est d'en effacer plusieurs.

    Le problème c'est que cela ne fonctionne pas car je ne peux pas faire +1
    sur un truc que je viens d'effacer ... comment je peux faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
        l_Vecteur::iterator i_Vect = svList->begin();
        while (i_Vect != svList->end())
        {  
     
         delete *i_Vect; 
         svList->remove(*i_Vect);
         *i_Vect=NULL;
     
         i_Vect++;
        }
    Merci
    MProg

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Et si tu détruisais tout ce vers quoi pointent les itérateurs pour commencer, auquel cas tu peux continuer à parcourir ta liste, et ensuite faire un std::remove ?

  8. #8
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par MProg Voir le message
    C'est une bonne façon pour effacer un élément de ma liste
    Mais mon objectif est d'en effacer plusieurs.
    Quand tu dis plusieurs, c'est tous, ou bien quelques uns?

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

Discussions similaires

  1. [Tableaux] suppression d'élément d'un tableau
    Par maysa dans le forum Langage
    Réponses: 8
    Dernier message: 04/04/2007, 08h37
  2. Suppression d'éléments dans un tableau (Array)
    Par jeremie74 dans le forum Flash
    Réponses: 4
    Dernier message: 06/03/2007, 13h54
  3. Suppression d' éléments dans une liste.
    Par conan76 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 02/03/2007, 09h33
  4. [Tableaux] Suppression d'élément de tableau
    Par jpascal dans le forum Langage
    Réponses: 2
    Dernier message: 27/12/2006, 15h11
  5. [xslt] Suppression des éléments sans contenu.
    Par dibbouk dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/06/2005, 17h17

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