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 :

Bug tres etrange avec une itération sur une map


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 79
    Points
    79
    Par défaut Bug tres etrange avec une itération sur une map
    Bonjour

    j'ai un bug que je ne comprends pas, voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (std::map<int, SchedTask*>::iterator i = handlers.begin(); i != handlers.end(); ++i)
    {
        handlers.erase(i->second->id);
        delete i->second;
    }
    je compile sous linux avec GCC4.1 -> ca plante : l'iterator continue même s'il est en dehors de la map (donc bug sur le delete)
    je compile avec VS 2005 -> ca marche.

    et il me semble que chez un collègue ca marchait il y a qq mois (sous linux GCC3.X)

    Est ce que qq trouve ca normale?
    Est ce que qq a une idée a pour résoudre ce probleme?

    merci a bientot

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour

    je dirait que ton code est faux. tout simplement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (std::map<int, SchedTask*>::iterator i = handlers.begin(); i != handlers.end(); ++i)
    {
        handlers.erase(i->second->id);//pourquoi utiliser id??, sinon cela invalide i. De coup il y as un problème avec ++i
        delete i->second;//indéfinie
    }
    tu devrait plustôt faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::map<int, SchedTask*>::iterator end = handlers.end();
    for (std::map<int, SchedTask*>::iterator i = handlers.begin(); i != end ; i=handlers.erase(i))
    {
     delete i->second;
    }
    ou (je pense plus rapide)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    std::map<int, SchedTask*>::iterator end = handlers.end();
    for (std::map<int, SchedTask*>::iterator i = handlers.begin(); i != end ; ++i)
    {
     delete i->second;
    }
    handlers.clear();

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 192
    Points : 79
    Points
    79
    Par défaut
    Et bien merci beaucoup par ta réponse.
    ca marche super
    Encore merci
    a bientot

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Fais attention, dès que tu modifies un conteneur (ajout ou suppression d'élément) les itérateurs peuvent (si ce n'est pas toujours?) devenir invalides.

    Pense aussi à faire des typedef sur tes conteneurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public:
    typedef std::map<int, SchedTask*> SchedTaskMap
    Ca évite de réécrire du code lourd et de faire des erreurs.

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

Discussions similaires

  1. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  2. Réponses: 7
    Dernier message: 22/10/2009, 17h43
  3. Réponses: 9
    Dernier message: 09/12/2008, 00h07
  4. probleme avec l'appui sur une touche sur une jframe ou jdialog
    Par jeanfeu dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 05/08/2008, 16h14
  5. Problème avec l'ajout d'une partition sur une table
    Par marvelromy dans le forum Administration
    Réponses: 1
    Dernier message: 30/06/2008, 08h57

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