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 :

Problème avec std::Vector


Sujet :

SL & STL C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Problème avec std::Vector
    Bonjour à tous,

    J'ai un petit soucis avec les vector...
    En fait quand on fait un push_back, il supprime l'object qu'on vient s'insérer après l'avoir recopié dans sa liste.
    Mon objet que j'insère contient un pointeur vers un autre objet, que j'initialise dans l'implémentation avec un new, et que je détruit dans le destructeur s'il existe.

    Le soucis est que le fait de l'insérer dans le vector ça le recopier puis le supprime, alors ça apel son destructeur et donc ça supprime son objet membre...
    Vous voyez l'truc?

    Donc je peux faire des vector de pointeur mais bon, j'aimerai éviter c'est pour ça.

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Un vecteur va toujours effectuer des copies de tes objets, il ne stockera jamais les originaux.

    Donc si ton objet ne peux pas être copié stocke des pointeurs, sinon c'est que ton objet est mal conçu.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Ben j'ai fait ça:

    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
     
    class Objet1
    {
        public:
            Objet1();
            ~Objet1();
     
        private:
            Objet2* m_objet2;
    };
     
    Objet1::Objet1()
    {
        m_objet2 = new Objet2();
    }
     
    Objet1::~Objet1()
    {
        delete m_objet2;
    }
    Ensuite autrepart j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
        Objet1 objet1;
        m_vector.push_back(objet1);
    }
    Avec ça il passe deux fois dans le destructeur de objet1. Une fois en faisant push_back, et une fois quand on passe l'accolade. Lors de la recopie de l'objet1, il a recopié le pointeur vers l'objet2, mais il pointe toujours vers le même Objet2 qui a été détruit précédemment car le destructeur a été appelé...

    Donc c'est normal que ça ne fonctionne pas, mais comment je peux faire pour que ça aille?

    Merci LouLou

    P.S.: T'as vu mes "m_"? :p
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  4. #4
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si ta classe est copiable alors il faut lui ajouter un constructeur de copie et un opérateur d'affectation. Ces deux-là géreront en l'occurence la copie correcte (duplication, comptage de référence, clonage, ...) de ton pointeur membre.

    Le mieux serait tout de même d'utiliser un pointeur intelligent, ça t'éviterait bien des ennuis.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    C'est quoi un pointeur intelligent? Comment tu fais ça?

    Merci Loulou
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  6. #6
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    merci
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est pas très conseillé d'utiliser les auto_ptr dans ce cas car dans les opérations sur les conteneurs standards, il peut y avoir des recopies sans le dire. Or, si tu utilises un auto_ptr dans un objet qui est recopié pour faire une comparaison par exemple, l'auto_ptr cède la gestion du pointeur à la copie qui sera détruite à la fin de la fonction de comparaison et donc on perd l'objet membre.
    Le mieux est d'utiliser les smart pointers de boost.

    C'est bien d'utiliser ce genre d'idiome

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Oui j'ai vu dans la fac des trucs sur boost, je vais télécharger la librairie, la doc etc... et l'intégrer au maximum.

    Merci beaucoup
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

Discussions similaires

  1. Problème avec les vector
    Par lostchina dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/03/2007, 10h51
  2. Probleme avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 2
    Dernier message: 12/03/2007, 16h51
  3. problème avec std::cin
    Par _LVEB_ dans le forum SL & STL
    Réponses: 4
    Dernier message: 20/02/2007, 00h35
  4. Problème avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 4
    Dernier message: 31/12/2006, 14h27
  5. Problem avec std::vector
    Par boiteweb dans le forum SL & STL
    Réponses: 5
    Dernier message: 29/04/2006, 12h56

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