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 :

[STL] Iterateur et destructeur


Sujet :

SL & STL C++

  1. #1
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut [STL] Iterateur et destructeur
    Bonjour tout le monde.

    Le probleme est le suivant:

    Dans une classe nous avons deux donnees membres. Une liste (std::list<>), et un iterateur sur cette liste. Or il apparait que durant l'execution et au moment de l'appel au destructeur de la classe, la liste est detruite avant l'iterateur, et que du coup le programme explose et meurt dans d'atroces souffrances.

    Donc ma question est la suivante:

    1_ Peut-on controler l'ordre de destruction des variables locales ? Je pense que non mais peut etre une ruse de sioux le permet-elle.
    2_ Sinon, et ce serait la meilleure solution, y aurait-il un moyen de remettre l'iterateur "a zero" pour que la destruction de la liste sur laquelle il pointe n'ai pas d'incidence et qu'il puisse mourir de sa belle mort.

    En vous souhaitant une bonne journee et en vous remerciant d'avance.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    C'est normalement pas parce que le container disparaît avant l'itérateur que le programme explose (ou alors c'est vraiment une mauvaise implémentation de la STL ou un mauvais compilateur), mais l'itérateur devient tout simplement invalide.

    A part ça, bien sûr que si on peut contrôler l'ordre de destruction des variables locales
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {
      list<int> X;
      {
        list<int>::iterator it=X.begin();
        ...
      }
    }

  3. #3
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    D'accord pour l'explosion.

    Pour l'ordre de destruction, je me suis mal exprime. J'ai parle de donnees membre au debut du post, c'est toujours des memes qu'ils s'agit. Il y a une liste, et un iterateur sur list comme donnees membres d'une classe. Et on affecte myClass->myList.begin() a l'iterateur myClass->myIterator.

    Donc oui l'iterateur devient invalide. Et c'est moche.

    Que faire pour eviter que l'iterateur soit invalide a la destruction de la classe ?
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  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
    Pour l'ordre de destruction, je me suis mal exprime. J'ai parle de donnees membre au debut du post, c'est toujours des memes qu'ils s'agit
    Les données membres sont construites dans l'ordre de déclaration, et détruites dans l'ordre inverse.

    Que faire pour eviter que l'iterateur soit invalide a la destruction de la classe ?
    Ca ne gène pas vraiment puisque tout s'apprête à être détruit. Et dans le destructeur l'itérateur est encore valide.

  5. #5
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Laurent Gomila
    Les données membres sont construites dans l'ordre de déclaration, et détruites dans l'ordre inverse.
    Je savais pas. Heureux de l'apprendre :-).

    Citation Envoyé par Laurent Gomila
    Ca ne gène pas vraiment puisque tout s'apprête à être détruit. Et dans le destructeur l'itérateur est encore valide.
    Ouep.

    Donc le probleme a du etre mal isole... On verifie ca et je posterais un morceau de code compilable pour montrer le probleme des que on l'a reduit.

    En attendant merci de vos reponses.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 60
    Points : 50
    Points
    50
    Par défaut
    Petite précision:

    Les données membres sont construites dans l'ordre de déclaration, et détruites dans l'ordre inverse.
    L'ordre d'initialisation des données membre n'est pas normalisé
    Cours et ateliers d'initiation à la mosaique LesPierresArcEnCiel

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Si :

    Citation Envoyé par Le standard 12.6.2/5
    Initialization shall proceed in the following order:
    — First, and only for the constructor of the most derived class as described below, virtual base classes shall be initialized in the order they appear on a depthfirst lefttoright traversal of the directed acyclic graph of base classes, where “lefttoright” is the order of appearance of the base class names in the derived class basespecifierlist.
    — Then, direct base classes shall be initialized in declaration order as they appear in the basespecifierlist (regardless of the order of the meminitializers).
    — Then, nonstatic data members shall be initialized in the order they were declared in the class definition (again regardless of the order of the meminitializers).
    — Finally, the body of the constructor is executed.
    [Note: the declaration order is mandated to ensure that base and member subobjects are destroyed in the reverse order of initialization. ]
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  8. #8
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Je veux pas être comme ça, mais:
    - bdeuu s'est inscrit spécialement sur le forum pour son premier message
    - pour déterrer une discussion de presque un an
    - afin de contredire quelqu'un
    - par une idiotie

    Bienvenu au club...

Discussions similaires

  1. [STL] condition fin de boucle avec iterateurs
    Par ZaaN dans le forum SL & STL
    Réponses: 5
    Dernier message: 30/06/2007, 14h52
  2. Réponses: 2
    Dernier message: 19/01/2007, 20h00
  3. pb avec iterateur const sur une list STL
    Par Muetdhiver dans le forum SL & STL
    Réponses: 4
    Dernier message: 14/01/2007, 16h39
  4. STL : problème avec un iterateur
    Par fabienpot dans le forum SL & STL
    Réponses: 4
    Dernier message: 06/09/2006, 09h06
  5. STL iterateur pour queue
    Par Mathieu.Nanoux dans le forum SL & STL
    Réponses: 2
    Dernier message: 05/11/2004, 00h35

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