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::map


Sujet :

SL & STL C++

  1. #1
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 412
    Points : 20 563
    Points
    20 563
    Par défaut Problème avec std::map
    Bonjour,

    j'ai un gros problème avec l'utilisation de std::map.
    Je m'arrache les cheveux de la tête.
    Lorsque j'appelle ::clear () cela plante , sans aucune initialisation, le conteneur étant totalement vide.
    Même avec quelques éléments

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct Mastruct
    {
    std :: string strDetail;
    BOOL bBooleen ;
    };
     
    std::map<std::string ,MaStruct>  monConteneur; 
    monConteneur.clear();/// plante

    le code plante dans xtree de la STL
    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
     
    #if _HAS_ITERATOR_DEBUGGING
    	void _Orphan_ptr(_Myt& _Cont, _Nodeptr _Ptr) const
    		{	// orphan iterators with specified node pointers
    		_Lockit _Lock(_LOCK_DEBUG);
    		const_iterator **_Pnext = (const_iterator **)&_Cont._Myfirstiter;
    		while (*_Pnext != 0)
    			if ((*_Pnext)->_Ptr == _Myhead
    				|| _Ptr != 0 && (*_Pnext)->_Ptr != _Ptr)
    				_Pnext = (const_iterator **)&(*_Pnext)->_Mynextiter;
    			else
    				{	// orphan the iterator
    				(*_Pnext)->_Mycont = 0;
    				*_Pnext = (const_iterator *)(*_Pnext)->_Mynextiter;
    				}
    		}
     #endif /* _HAS_ITERATOR_DEBUGGING */

    Pour des raisons obscures (*_Pnext) est différent de NULL ou 0x00000000
    Quelqu'un a-t-il une idée ?

    J'utilise VS2008,le projet est compilé avec l'option multithread

  2. #2
    Membre averti

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Points : 350
    Points
    350
    Par défaut
    Bonjour,

    Comme le type MaStruct contient un membre std::string, il faut absolument créer un constructeur par défaut, un constructeur de copie, et un opérateur de copie. C'est strictement nécessaire pour pouvoir utiliser MaStruct dans un des conteneurs de la librairie standard.

    Ces soucis viennent peut-être de là.

    Didier

  3. #3
    Membre actif Avatar de ronan99999
    Inscrit en
    Juillet 2003
    Messages
    279
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2003
    Messages : 279
    Points : 299
    Points
    299
    Par défaut
    Bonjour,
    j'ai exécuter ton code pas soucis.
    Il manque pas quelque chose?

    Par contre tu utilises le type BOOL (win32?), tu peux directement utiliser bool.

    Sinon en ce qui concerne le constructeur par défaut, l'affectation et le constructeur par recopie etc...

    Tu en as un par défaut sans l'écrire.

  4. #4
    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 : 50
    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
    Il y a des chances que le problème soit ailleurs, et ait corrompu la mémoire de ta map...

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 412
    Points : 20 563
    Points
    20 563
    Par défaut
    Ok merci à tous pour les réponses , je vais voir concernant le constructeur par défaut



    Citation Envoyé par ronan99999 Voir le message
    j'ai exécuter ton code pas soucis.
    Il manque pas quelque chose?

    non j'ai donné le code tel que je l'utilise ; j'ai des plantages simplement en faisant clear() ou bien même avec MonConteneurMap(iterateur.begin(),iterateur.end());

  6. #6
    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 : 50
    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
    Telle que présentée, Mastruct a tout ce qu'il faut pour être mise dans une map. Pas besoin de lui ajouter quoi que ce soit (et il y a toujours le risque de se planter en le faisant...).

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 632
    Points : 30 711
    Points
    30 711
    Par défaut
    Salut,
    Citation Envoyé par dtrosset Voir le message
    Bonjour,

    Comme le type MaStruct contient un membre std::string, il faut absolument créer un constructeur par défaut, un constructeur de copie, et un opérateur de copie. C'est strictement nécessaire pour pouvoir utiliser MaStruct dans un des conteneurs de la librairie standard.

    Ces soucis viennent peut-être de là.

    Didier
    Absolument pas...

    En C++, les classes et les structures sont strictement équivalentes, à la seule exception près de la visibilité par défaut de leur membres (private pour class et public pour struct).

    Le compilateur introduit un constructeur par défaut, un constructeur par copie, un opérateur d'affectation et un destructeur automatiquement si le développeur n'en fournit pas d'équivalent.

    Tu ne dois fournir une version propre de ces fonctions que lorsque tu manipule toi même des pointeurs à l'intérieur de ta classe ou de ta structure.

    La classe std::string manipule, effectivement, un ou des pointeurs en interne, mais, comme les quatre fonctions sont correctement définies (en plus de beaucoup d'autres, d'ailleurs), tu n'a strictement aucun soucis à te faire pour une structure ou une classe qui manipule un objet de type std::string

  8. #8
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 412
    Points : 20 563
    Points
    20 563
    Par défaut
    Bonjour à tous encore merci pour les réponses.
    Eh bien c;est pareil avec un simple
    std::map<std::string,bool> je suis bloqué à cause de cela et je m'arrache les cheveux de la tête
    Même avec Vs2010 c'est pareil...
    bon je vais continuer à chercher mais merci tout de même

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Comme l'a dit Loïc, on dirait que ta mémoire est corrompue ailleurs. Dit autrement, ton plantage de std::map est du à un bug ailleurs. (Une référence sur un map détruit ? )

  10. #10
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 412
    Points : 20 563
    Points
    20 563
    Par défaut
    Salut la compagnie
    bon j'ai résolu le problème.
    En déclarant comme pointeur avec un new cela fonctionne.
    Je ne comprends pas pourquoi comme membre d'une classe cela plante ( non déclarée comme pointeur )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::map<std::string ,MaStruct>  *monConteneur; 
    monConteneur=new std::map<std::string ,MaStruct>;



    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Comme l'a dit Loïc, on dirait que ta mémoire est corrompue ailleurs. Dit autrement, ton plantage de std::map est du à un bug ailleurs. (Une référence sur un map détruit ? )
    ok merci pour la réponse.
    Non aucune insertion , rien..

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    bon j'ai résolu le problème.
    En déclarant comme pointeur avec un new cela fonctionne.
    Je ne comprends pas pourquoi comme membre d'une classe cela plante ( non déclarée comme pointeur )
    Je doute fortement que le problème de fond soit réellement résolu. Il est probable que le code tombe tout simplement en marche.

    Peux-tu fournir un exemple minimal et compilable qui reproduit le problème ?

  12. #12
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 412
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 412
    Points : 20 563
    Points
    20 563
    Par défaut
    Citation Envoyé par gl Voir le message
    Je doute fortement que le problème de fond soit réellement résolu. Il est probable que le code tombe tout simplement en marche.

    Peux-tu fournir un exemple minimal et compilable qui reproduit le problème ?
    salut GL cela fonctionne parfaitement de toute façon l'appli n'est pas critique .
    Je ne fais aucune opération spéciale

  13. #13
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Tu as un probleme "caché". L'ignorer ne fera que te rendre encore plus ignorant.

    Ici ta solution n'est pas censé changer quoi que ce soit à ton problème. Pire : tu complexifie l'utilisation de la map et permet de plus facilement faire des erreurs avec. Tu n'as fais que mettre le probleme sous le tapis, mais ça dépasse et ça se voit.

    Si cette solution marche, c'est un hasard. De loin ça ressemble beaucoup a de la corruption de mémoire.

    Je serais toi, je vérifierai tout le code : je chercherai d'abord tout ce qui est alloué avec new ou malloc et je chercherai alors les delete et free qui DOIVENT correspondre. Ensuite je vérifierai toutes mes boucles par index voir si je ne fais pas de déplacement. Enfin je vérifierai toutes manipulation de pointeurs, en particulier les déplacements "manuels" de pointeurs.

  14. #14
    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 : 50
    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
    Citation Envoyé par Klaim Voir le message
    Je serais toi, je vérifierai tout le code : je chercherai d'abord tout ce qui est alloué avec new ou malloc et je chercherai alors les delete et free qui DOIVENT correspondre. Ensuite je vérifierai toutes mes boucles par index voir si je ne fais pas de déplacement. Enfin je vérifierai toutes manipulation de pointeurs, en particulier les déplacements "manuels" de pointeurs.
    Certains outils peuvent aussi aider à debugger ce genre de choses (valgring, intel parallel studio...)

  15. #15
    Membre averti Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Points : 302
    Points
    302
    Par défaut
    J'ai eu ce type de problème à une époque, plantage aléatoire lors de constructions/destructions d'objets. C'était dû à un dépassement de tampon en écriture sur un tableau dynamique qui avait lieu un peu avant. Si ca peut t'aider...

  16. #16
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Certains outils peuvent aussi aider à debugger ce genre de choses (valgring, intel parallel studio...)
    Oui, en fait j'ai tendance a aimer chercher a la main parceque ça me permet de faire du refactoring au passager (relire, simplifier, factoriser etc).

    Mais bon sur mes projets perso j'ai pas de contrainte forte d etemps...

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

Discussions similaires

  1. Problème avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 4
    Dernier message: 31/12/2006, 15h27
  2. j'ai une probléme avec le map
    Par killer_instinct dans le forum C++
    Réponses: 4
    Dernier message: 10/12/2006, 15h58
  3. Réponses: 4
    Dernier message: 15/10/2006, 19h05
  4. Problème avec std::Vector
    Par mister3957 dans le forum SL & STL
    Réponses: 8
    Dernier message: 16/02/2006, 11h18
  5. Problème avec memory mapping
    Par gemai dans le forum C
    Réponses: 13
    Dernier message: 04/07/2003, 10h50

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