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

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 43
    Points : 28
    Points
    28
    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 régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    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 : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    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
    Points : 4 625
    Points
    4 625
    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>
    Boost ftw

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    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.

  7. #7
    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
    Citation Envoyé par Krishna Voir le message
    Merci pour les réponses.
    J'ai survolé quelques articles sur les pointeurs intelligents et je pense les utiliser plus tard.
    Cours-y rapidement, te dirais-je
    Un peu connexe à ce qu'on dit dans cette discussion, tu risques de perdre ton pointeur avec des choses comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    m[0]=new int(1);
    m[0]=new int(2);
    Prudence, prudence....
    Bien sûr posé comme ça ça à l'air absurde. Mais dans un code complexe ce sont des cas qui peuvent apparaître. Et je parle d'expérience car j'ai déjà eu à debugger ce genre de chose (dans une équipe tu ne maitrises pas forcément ce que fait tout le monde)

+ 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