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 :

Destruction dans une map


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut Destruction dans une map
    Enfait je crois que mon problème s'apparente juste a un problème de destruction du contenu d'une map .

    j'ai une map qui associe des strings à des cItem* .
    ( le nom de cette map est Items )

    A un moment ( dans une fonction d'un objet , je vais apellé la destrucion de celui-ci par mon gestionnaire d'objet ) .

    je fais ceci :

    void cRessourcesManager::remove(const std::string & Id )
    {
    delete Items[Id] ;
    Items.erase(Id) ;
    }
    Jusuqe la tout va bien , par contre en quitant mon programme, je vide cette map et je détruit les objet pointé ( c'est lors de cette pahse que ca plante)

    void cRessourcesManager:elete()
    {
    std::for_each(Items.begin(), Items.end(), DeleteSecond());
    Items.clear();
    }
    avec :
    // Structure qui contient la fonction premettant de détruire les cItem * de ma map .
    struct DeleteSecond {
    template <class Pair> void operator()(Pair & p) const
    { delete p.second; }
    };
    Je supose que le problème vient de mon "delete Items[id]" non ?

  2. #2
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Dans le doute j'ai remplacé ma fonction remove par ceci :
    void cRessourcesManager::remove(const std::string & Id )
    {
    std::map<std::string, cItem*>::iterator it ;
    it = Items.find(Id) ;
    delete it->second ;
    Items.erase(Id) ;
    }
    Ca ne change rien .
    Je ne comprend pas ... l'objet est bien détruit , son identifiant n'est plus présent dans la map alors pourquoi le DeleteSecond() sur ma map plante ...?

  3. #3
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Salut, je dirais non
    J'ai juste virer ton template pour le Delete. mais ce programme fonctionne.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include <map>
    #include <algorithm>
    #include <iostream>
    using namespace std;
     
    typedef map<int, char*> MItem;
    MItem mItem;
     
    void DeleteSecond( MItem::value_type& p ) {
    	delete[] p.second;
    }
     
    void Display( MItem::value_type& p ) {
    	cout << p.first << ":" << p.second << endl;
    }
     
    int main()
    {
    	for( int i = 0; i < 10; ++i ) {
    		mItem[i] = new char[50];
    		strcpy( mItem[i], "BONJOUR" );
    	}
    	for_each( mItem.begin(), mItem.end(), Display );
     
    	for( int i = 0; i < 5; ++i ) {
    		delete[] mItem[i]; mItem.erase(i);
    	}
    	for_each( mItem.begin(), mItem.end(), Display );
     
    	for_each( mItem.begin(), mItem.end(), DeleteSecond );
    	mItem.clear();
    }

  4. #4
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Hum en gros mon problmèe ne viendrai pas de la ?

    J'aurais été tenté de pensé que le problème viennent de la destruction de l'objet même mais ca ne semble pas être le cas , enfin bref, je met quand même la portion de code conceré .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void cFireTest::Update() 
    {
    	if ( IsOver() )
    	{
    		cGameItem::GetInstance().remove(Name) ; 
    		cRessourcesManager::GetInstance().remove(Name);
    		return ;
    	}
    }
    L'objet va donc être détruit par le 2eme apelle de fonction, j'ignore si le fait qu'il est des instrcution dans ce même objet aprés sa suppression va avoir un effet ou pas ... ( je dirai que c'est apas jolie tout ca, mais je n'ai pas trouvé la "faille" ) .

    Retour a la case départ donc.... hummm

Discussions similaires

  1. [Delta3d] probléme avec un objet dans une map
    Par astragoth dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 27/03/2006, 14h49
  2. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 08h40
  3. allocation dans une <map>
    Par elekis dans le forum C++
    Réponses: 3
    Dernier message: 28/09/2005, 22h30
  4. Inserer des elements dans une map sans rangement ?
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 07/09/2004, 11h09
  5. 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

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