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 :

[destructeur] Detruire correctement une map


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut [destructeur] Detruire correctement une map
    Bonjour à tous,

    Bien qu'ayant lu la FAQ là dessus, je ne trouve pas tout à fait mon bonheur...

    voici ma classe Choc:
    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
    class Choc {
    public:
    	Choc (int num_choc); // Constructeur général
    	Choc (Choc & choc);
    	~Choc();
     
    	void setNumeroChoc (int);
    	void ajouterCFP(CFP * cfp);
    	void ajouterCFP(std::string nom_composant);
    	void ajouterCFPBiVisee(std::string nom_composant);
     
    private:
    	int m_numero_choc;
    	std::map<std::string, CFP *> m_tableau_cfp;
    	std::vector<std::string> m_cameras_disponibles;
    Lorsque dans mon programme principal je lance
    Ca plante sur mon destructeur : invalid parameters !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Choc::~Choc()
    {
    	std::map<std::string, CFP*>::iterator iter;
    	for (iter = m_tableau_cfp.begin(); iter != m_tableau_cfp.end(); iter++)
    	{
    		m_tableau_cfp.erase(iter->first); // ICI
    	}
    }
    Ma destruction n'est pas propre?
    Merci de votre aide !

    EDIT: je me demande même si je supprime mes pointeurs vers CFP ?

  2. #2
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pourquoi ne pas utiliser le erase qui prend un itérateur ? Là ta map va devoir retrouver le noeud à supprimer, alors que toi tu le connais déjà.

    Ensuite, après la suppression, l'itérateur est invalide, donc iter++ ne fonctionnera pas.

    Tu pourrais aussi utiliser des pointeurs intelligents (voir FAQ).

    Et enfin, ce que tu fais ne sert strictement à rien
    Le destructeur de std::map s'occupe de supprimer les éléments stockés. Note pour le jour où tu voudras le faire hors d'un destructeur : il faut utiliser la fonction membre clear()
    Par contre tu devrais faire un delete sur les éléménts, à moins que ce ne soit pas ta map qui gère leur durée de vie.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Pourquoi t'as toujours les réponses à toutes les questions, même celles que je me suis pas encore posées???

    Oui, tu as raison partout. Je vais repartir sur un std::auto_ptr ou un boost::shared_ptr()...

    Merci!

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je vais repartir sur un std::auto_ptr
    Attention : pas de std::auto_ptr dans un conteneur. Explications dans la FAQ.
    boost::shared_ptr est très bien par contre. Ou encore mieux : directement un boost::map_ptr (ou un truc dans le genre) au lieu d'un std::map.

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Merci pour le tuyau de std::auto_ptr, j'avais oublié !

    Tu veux parler de Boost Property Map?

    EDIT: non il s'agit en effet de : boost::ptr_map
    Trouvé ICI

    Merci Laurent !

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Juste une petite question: ce ptr_map est une map de shared_ptr?
    Là où je veux en venir, c'est comment le ptr_map décide s'il doit supprimer un élément?
    Comment est mis à jour le compteur de référence?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    boost::ptr_map<std::string, Classe> Map;
    [...]
    Classe * cl = Map["toto"];
    Ce code va t-il incrémenter le compteur de référence d'un shared_ptr ?

    Je me pose plein de questions, j'avoue...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/07/2007, 21h18
  2. Inserer des elements dans une map sans rangement ?
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 07/09/2004, 11h09
  3. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39
  4. [ MAP ] Choix d'une MAP
    Par mawashee dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 09/08/2004, 16h39
  5. Technique pour faire une map en relief
    Par rvzip64 dans le forum OpenGL
    Réponses: 4
    Dernier message: 28/06/2004, 22h44

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