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 :

Problème avec erase d'une map


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut Problème avec erase d'une map
    Bonjour,

    Voila je n'arrive pas à voir pourquoi lorsque je fais un erase puis un delete sur ma map mon application plante. Voici le petit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Image::_add_span (int old_id_span, int new_id_span) throw () {
    	std::map<int, Span *>::iterator old_it = this->_listSpan.find (old_id_span);
    	std::map<int, Span *>::const_iterator new_it = this->_listSpan.find (new_id_span);
    	PersoTypes::ListPoints old_pixels = old_it->second->content ();
     
    	for (PersoTypes::ListPoints::const_iterator it=old_pixels.begin ();it!=old_pixels.end ();it++) {
    		this->_pixel (*it).id_span (new_id_span);
    		new_it->second->content ().push_back (*it);
    	}
    	this->_listSpan.erase (old_it);
    	delete old_it->second;
    }
    Ce sont les deux dernières lignes de la méthode qui foire. Quelqu'un aurait une idée ? Merci d'avance

  2. #2
    Membre actif
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    Points : 280
    Points
    280
    Par défaut
    Je suppose que ta variable this->_listSpan est de type std::List<Span> ou std::List<Span *>.

    Si c'est bien le cas, l'appel de la méthode erase avec un iterator en paramètre enlève bien l'élément de la liste, mais il en profite aussi pour appeler le destructeur de l'élément en question.

    Tu as donc détruit la variable old_it. Tu ne peux donc pas utiliser l'opérateur -> dessus après. Je pense que ton erreur vient de là.

    Source : This effectively reduces the list size by the number of elements removed, calling each element's destructor before. (cplusplus.com)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    non mon "this->_listSpan" est un "std::map<int, Span *>" et même si je ne met pas le "delete" à la fin l'application plante

  4. #4
    Membre actif
    Homme Profil pro
    Consultant BigData
    Inscrit en
    Juillet 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant BigData

    Informations forums :
    Inscription : Juillet 2009
    Messages : 129
    Points : 280
    Points
    280
    Par défaut
    pourrais-tu donner le message d'erreur qui apparait quand l'application plante ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    C'est une application graphique et cela ce traduit par une erreur de ma dll. Il n'y a donc pas de message d'erreur précisément.

  6. #6
    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,
    Tu n'es pas obligé de mettre 'this->' pour accéder aux membres de ton objet dans une fonction de ta classe. Cela nuit un peu à la lisibilité.
    Ceci dit, je soupçonne moins un problème de ta map que plutôt un problème de gestion de pointeurs bruts dans ta map. Cf Les Pointeurs intelligents.

  7. #7
    Membre habitué Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Points : 150
    Points
    150
    Par défaut
    Salut,

    Citation Envoyé par scary
    je n'arrive pas à voir pourquoi lorsque je fais un erase puis un delete sur ma map mon application plante.
    Pour répondre à cette question, après ton erase(), la paire pointée par l’itérateur olt_it n’existe plus, tu ne peux donc pas récupérer son membre second.
    Il te faut simplement faire le delete avant le erase. Mais comme le dit 3DArchi, tu devrais aller voir du côté des pointeurs intelligents.

    Citation Envoyé par scary
    et même si je ne met pas le "delete" à la fin l'application plante
    Là, je comprend pas pourquoi, ça devrait « juste » provoquer une fuite de mémoire.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Oui j'avais vu ma première erreur car d'après ce que j'ai pu lire dans la doc du erase, au moment du erase chaque destructeur de ce que l'on veut effacé est appellé donc cela en effet aurait créé une fuite mémoire.

    Ensuite je ne comprends pas pourquoi en effet cela plante...

    Je vais relire mon appli depuis le début et regardé si j'ai pas fais une bétise plus haut.

    Pour les smart pointer en effet c'est très intéressant je vais regarder cela de plus près

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Points : 114
    Points
    114
    Par défaut
    Voila j'ai résolue mon problème, en fait il était plus haut, j'analysais une partie d'un tableau qui n'existait plus et donc quand je voulais accéder au span corespondant à cet id (contenu dans le tableau) dans la map et bien il plantait

    Autant pour moi et merci

Discussions similaires

  1. problème avec insert dans une map
    Par LePetitBricoleur dans le forum C++
    Réponses: 3
    Dernier message: 01/11/2007, 11h52
  2. FAQ : problème avec création d'une requete en VBA
    Par Oluha dans le forum VBA Access
    Réponses: 14
    Dernier message: 14/02/2006, 12h05
  3. Problème avec RegEx et une Query string
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 15h48
  4. Problème avec affichage d'une table modifiée
    Par auriolbeach dans le forum Access
    Réponses: 6
    Dernier message: 31/10/2005, 15h45
  5. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19

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