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++

  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...

  7. #7
    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
    En fait, c'est le conteneur qui gère la vie des éléménts. En l'occurence quand tu en supprimes un, il va être détruit avec delete.

    Ensuite l'interface est faite pour que tu manipules tes éléments directement, pas des pointeurs. Donc en fait tu ne t'occupes à aucun moment des références ou de la validité des pointeurs, c'est comme si tu avais un std::map<std::string, Classe>.

    Enfin je ne l'ai jamais utilisé, donc tu devrais plutôt lire la doc pour avoir des explications plus précises

+ 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