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 :

erase et delete d'un vector


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 105
    Par défaut erase et delete d'un vector
    Bonjour à tous;

    J'ai un problème dans l'utilisation de conteneur vector
    Voici un bout de code que j'utilise
    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
     
    vector<Classetype*>m_Liste;
    void RemplirListe(){
    ClassType MonObjet1=new ClassType();
    m_Liste.push_back;
    .
    .
    .
    ClassType MonObjet10=new ClassTYpe();
    m_Liste_push_back(MonObje10);
    }
     
    void Supprimer(int type)
    {
    for(int i=0;i<m_Liste.size();i++)
    ClassType*  pObjet=(ClassType*)m_Liste[i]
      if(pObjet->TYpe()==type){
         delete pObjet;
         m_Liste.erase(&m_Liste[i]);
         return;
      }
    }
    Est ce que erase suffit tout seul ?

    2)Une autre petite question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ClassType* pMonObjet=new ClassType();
    void affectation(ClassType* pObjet)
    {
    pMonOBjet=new ClassType(*pObjet)//Constructeur par copie
     
    }
    Est ce que cette affectation produit une perte de mémoire
    Où, bien avant d'affecter, il faut faire un delete.

    Merci infiniment pour votre aide.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 44
    Par défaut
    Un vecteur de T n'alloue que la mémoire necessaire au stockage des objets de type T.

    Dans le cas ou T=Type*, il n'allouera que l'espace necessaire au stockage du pointeur et non l'espace de l'objet pointé.

    En conséquence tu doit allouer pour chaque push_back et détruire avant chaque remove :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    vector<T*> mon_vecteur;
    vector<T*>::iterator it;
     
    mon_vecteur.push_back(new T(...));
    ...
    delete *it; // libère la mémoire pour stocker le T
    mon_vecteur.erase(it); // Retire et libère la mémoire pour stocker le T*

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut Re: erase et delete d'un vector
    Citation Envoyé par Jahjouh
    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
     
    vector<Classetype*>m_Liste;
    void RemplirListe(){
    ClassType MonObjet1=new ClassType();
    m_Liste.push_back;
    .
    .
    .
    ClassType MonObjet10=new ClassTYpe();
    m_Liste_push_back(MonObje10);
    }
     
    void Supprimer(int type)
    {
    for(int i=0;i<m_Liste.size();i++)
    ClassType*  pObjet=(ClassType*)m_Liste[i]
      if(pObjet->TYpe()==type){
         delete pObjet;
         m_Liste.erase(&m_Liste[i]);
         return;
      }
    }
    Est ce que erase suffit tout seul ?
    erase suffit mais &m_Liste[i] n'est pas un moyen conforme d'obtenir un itérateur sur le ieme élément. Il faut utiliser m_Liste.begin() + i ou bien itérer avec un ... itérateur.

    Si supprimer un élément au milieu est courant et que l'indexation ne l'est pas (du moins l'indexation utile, pas celle de l'exemple où elle ne sert qu'à itérer), il faut envisager l'utilisation des std::list pour lesquels erase est plus performant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ClassType* pMonObjet=new ClassType();
    void affectation(ClassType* pObjet)
    {
    pMonOBjet=new ClassType(*pObjet)//Constructeur par copie
     
    }
    Est ce que cette affectation produit une perte de mémoire
    Où, bien avant d'affecter, il faut faire un delete.
    Il vaudrait vraissemblablement mieux en effet. Mais je me demande l'intérêt de ce que tu fais par rapport à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ClassType monObjet;
    void affectation(ClassType* pObjet)
    {
       monObjet=*pObjet;
    }
    Normalement un intérêt des pointeurs est l'utilisation du polymorphisme, mais ici tu as des constructeurs de copie (ce qui n'est pas très fréquent quand on utilise du polymorphisme) et surtout tu fais une affectation "tronquante" si le type dynamique de *pObjet n'est pas ClassType, ce que je n'ai jamais vu adéquat en présence de polymorphisme.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 105
    Par défaut
    En fait pour l'affectation de l'objet. Cet objet que je lui affecte un autre objet par construction de copie, c'est dans le cas d'une modification d'un objet dans une liste gérée par un mutex.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    T* Lire(U Identifiant); //renvoie un element de la liste
    void Traitement(T* pObjet) //modifie pObjet sans exlusion
    void Modifier(T* pObjet){
     
    delete pMonObjet; // objet cree precedement
    //pObjet est une copie modifiee de pMonObjet
    //Ensuite on met à jour pMonObjet par pObjet
    delete pMonObjet //libération 
    pMonObjet=new T(*pObjet) // pour la mise à jour.
    }

Discussions similaires

  1. Plantage sur deletion de std::vector
    Par uriotcea dans le forum C++
    Réponses: 8
    Dernier message: 20/02/2012, 21h09
  2. .erase sans effet sur mon vector
    Par fred94190 dans le forum SL & STL
    Réponses: 5
    Dernier message: 12/07/2011, 11h49
  3. delete et std::vector
    Par adurandet dans le forum C++
    Réponses: 9
    Dernier message: 31/10/2007, 16h44
  4. Réponses: 6
    Dernier message: 26/03/2006, 13h49
  5. vector et erase()
    Par gytr2 dans le forum SL & STL
    Réponses: 6
    Dernier message: 02/03/2004, 12h45

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