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 :

segfault lors de ll'iteration sur un stl vector


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut segfault lors de ll'iteration sur un stl vector
    Bonjour à tous.
    J'ai un "vector<string>" sur lequel je souhaite faire une itération. Lors de litération, il se peut que je doivent ajouter un élément à la fin du vecteur, mais qui ne doit pas compter (mon iteration doit se terminer sur le dernier élément présent au début de l'itération). J'utilise un iterator plutot que [] car je me sers de l'iterateur pour ensuite faire des suppression.
    Il se trouve que lorsque j'ajoute des éléments , le programme segfault. J'ai réduit le code à cet exemple :
    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
    28
     
    #include <iostream>
    #include <vector>
    using namespace std;
     
    void addElem(vector<string>*); 
     
    int main(int argc, char *argv[])
    {
      vector<string> myvector;
     
       myvector.push_back("one");
       myvector.push_back("two");
       myvector.push_back("three");
       myvector.push_back("four");
       vector<string>::iterator iter,end ;
       end = myvector.end();
       for ( iter = myvector.begin(); iter != end; iter ++ ) {
          cout << (*iter) << endl;
          addElem(&myvector);
       }
     
      return 0;
    }
     
    void addElem(vector<string>*vec) {
       vec->push_back("five");
    }
    Le programme plante apres avoir affiché "two".
    Je sais que la boucle "for" pourrait etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       for (unsigned int i = 0 ; i < 4 ; i ++ ) {
          cout << myvector[i] << endl;
          addElem(&myvector);
       }
    mais j'ai besoins d'utiliser un iterator dans mon "vrai" code.

    Pourriez vous me dire comment pouvoir ajouter des éléments à un vecteur lors d'une itération sans pour antant avoir de segfault (il semble que ce soit le fait que la fin du veteur change, malgré le fait que je le stocke).

    Merci d'avance,

    eponyme

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    je ne sais pas exactement pourquoi ca fait un segmentation fault mais en tout cas ce que tu fais te ramene à un as très gênant -> la boucle infinie !

    De plus je suppose que comme la structure interne du vector va changer a chaque ajout pour pouvoir gérer la mémoire tu te retrouves a pointer des élements qui ont "bougés" lors d'un ajout

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    Salut et merci pour ta réponse.
    Effectivement le risque de boucle infinie existe, c'est pour ca que je souhaite que les eléments nouvellement ajoutés ne soient pas pris en compte, et n'itérer que sur les éléments présents lors du début de la boucle.

    eponyme

  4. #4
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    ce que je te conseille de faire est de créer un vecteur temporaire auquel tu ajouteras alors tes éléments et tu itères simplement sur le vecteur "d'origine"

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 59
    Par défaut
    C'est effectivement ce qui semble le plus prudent. Merci pour ton aide.

    eponyme

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

Discussions similaires

  1. [Exception]Lors d'un validate sur un jframe
    Par cameleon2002 dans le forum Agents de placement/Fenêtres
    Réponses: 12
    Dernier message: 02/05/2005, 11h27
  2. Réponses: 3
    Dernier message: 24/01/2005, 11h57
  3. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  4. Problème lors d'un Update sur une date
    Par Nany dans le forum ASP
    Réponses: 3
    Dernier message: 19/05/2004, 22h37
  5. Execution d'une fonction lors de l'appui sur CTRL+ALT+I
    Par cyberlewis dans le forum Windows
    Réponses: 4
    Dernier message: 17/03/2004, 01h35

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