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 :

Conteneurs et pointeurs: comment faire un "delete" propre


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut Conteneurs et pointeurs: comment faire un "delete" propre
    Bonjour à tous!
    Si je créé un conteneur du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //...
    {
    std::map<int,int*> m;
    m[0]=new int(1);
    m[1]=new int(2);
    }//....
    Que devient l'espace alloué lorsque je "sors" des accolades? Faut-il le libérer et comment?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Par défaut
    Quand tu "sors" des accolades la map est détruite, mais tu as effectivement une fuite mémiore par rapport au "new int".

    La solution est dans la FAQ

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    Merci!
    Ce qui est vexant, c'est que j'avais regarder dans la FAQ avant de poster...

    Il y a encore un truc plus général sur les pointeurs que je ne cerne pas.
    Si j'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int* p=new int(2);
    p=new int(3);
    Est-ce que ça produit également une fuite ou s'agit-il d'une ré-allocation?

  4. #4
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Tu as effectivement une fuite de mémoire. Ton pointeur, au deuxième new, pointe vers un nouveau bloc en mémoire, et plus personne pointe vers le premier => fuite mémoire car impossible de le libérer.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Même si tu rajoutes des deletes à la fin de ton bloc, ton code ne sera pas exception-safe.

    Image le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::map<int,int*> m;
    m[0]=new int(1);
    m[1]=new int(2);
    delete m[1];
    delete m[0];
    Maintenant, que se passe-t-il si new int(2) lève une exception ?
    La mémoire pointée par m[0] n'est jamais libérée.

    Une solution, en C++0x, est
    std::map<int, std::unique_ptr<int> >.

    Des solutions moins bonnes en C++03 sont
    std::map<int, std::shared_ptr<int> >
    std::map<int, clone_ptr<int> >
    boost::ptr_map<int, int>

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    Merci pour les réponses.
    J'ai survolé quelques articles sur les pointeurs intelligents et je pense les utiliser plus tard.
    Pour le moment, j'ai ré-écrit mon destructeur mais sans tenir compte du cas soulevé par loufoque.

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

Discussions similaires

  1. Mon Delete ne marche pas!Comment faire?
    Par ghan77 dans le forum Bases de données
    Réponses: 4
    Dernier message: 24/01/2006, 16h45
  2. Pointeur intelligent boost : return NULL ->comment faire?
    Par choinul dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 21/12/2005, 16h24

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