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 :

Libération d'un pointeur lorsqu'il est utilisé dans 1 return


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Libération d'un pointeur lorsqu'il est utilisé dans 1 return
    Bonjour à tous,
    J'ai un problème pour la libération d'un pointeur...

    Comment je fais pour libérer un pointeur d'une fonction sachant que je le renvoie par un return...
    Le code après le return va être ignoré, alors, ou puis-je mettre mon delete?

    C'est peut-etre pas très clair, donc voici un petit exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MFDPOSS* intersectionMF(MFDPOSS *tmpdposs)
        {
          LIST* list_inter;
          list_inter = new LIST;
     
          // traitements permettant de calculer list_inter
     
     
          return new MFDPOSS(list_inter);
        }
    Comment je fais pour libérer le pointeur list_inter puisque je l'utilise dans mon return? Je crois qu'on peut le faire dans le destructeur de ma classe LIST, mais je ne suis pas sur de la manière de le faire.

    Merci pour votre aide!

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    - Soit tu demande à l'appelant de ta fonction d'appeler le delete au bon moment pour lui.

    - Soit tu emploies des pointeurs intelligents.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    - Soit tu demande à l'appelant de ta fonction d'appeler le delete au bon moment pour lui.
    En fait, ce pointeur n'est utilisé que localement dans la fonction, je ne peux donc pas le deleter à partir de l'appelant.

    - Soit tu emploies des pointeurs intelligents.
    Je ne connais pas les pointeurs intelligents...

    Mais si je fais dans le destructeur de ma classe LIST un "delete this;", est-ce que ça va marcher?
    Je pensais qu'à la fin d'une fonction les destructeurs des éléments locaux étaient appelés... Non?

    Merci encore pour vos eclaircissements...

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    Ben pour que le destructeur soit appelé il faut que delete le soit...
    Regarde du côté des smart ptr et du RAII:
    http://c.developpez.com/faq/cpp/?pag...S_intelligents
    http://c.developpez.com/faq/cpp/?pag...POINTEURS_raii

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut Re: Libération d'un pointeur lorsqu'il est utilisé dans 1 re
    Citation Envoyé par choinul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MFDPOSS* intersectionMF(MFDPOSS *tmpdposs)
        {
          LIST* list_inter;
          list_inter = new LIST;
     
          // traitements permettant de calculer list_inter
     
     
          return new MFDPOSS(list_inter);
        }
    Si j'ai bien compris (et donc en supposant que MFDPOSS n'a pas besoin du contenu de la liste par apres) , version bete est mechante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    MFDPOSS* intersectionMF(MFDPOSS *tmpdposs)
        {
          LIST* list_inter;
          list_inter = new LIST;
     
          // traitements permettant de calculer list_inter
     
          MFDPOSS* result = new MFDPOSS(list_inter);
          delete list_inter;
          return result;
        }
    version SL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MFDPOSS* intersectionMF(MFDPOSS *tmpdposs)
        {
          std::auto_ptr<LIST> list_inter;
          list_inter = new LIST;
     
          // traitements permettant de calculer list_inter
     
     
          return new MFDPOSS(list_inter.get());
        }
    Version Jean-Marc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MFDPOSS* intersectionMF(MFDPOSS *tmpdposs)
        {
         LIST list_inter;
          // traitements permettant de calculer list_inter
     
     
          return new MFDPOSS(&list_inter);
        }
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Merci pour votre aide!

    Je pense que je vais devoir me mettre aux pointeurs intelligents...

    Seulement, n'existe-t-il pas une manière de résoudre mon problème sans ces pointeurs intelligents... ?

    Je ne suis pas contre, mais ça semble un peu plus complexe...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Re: Libération d'un pointeur lorsqu'il est utilisé dans 1 re
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MFDPOSS* intersectionMF(MFDPOSS *tmpdposs)
        {
          LIST* list_inter;
          list_inter = new LIST;
     
          // traitements permettant de calculer list_inter
     
          MFDPOSS* result = new MFDPOSS(list_inter);
          delete list_inter;
          return result;
        }
    Oui, mais là, je ne fais que transférer le problème sur result... Comment je fais alors pour deleter result?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MFDPOSS* intersectionMF(MFDPOSS *tmpdposs)
        {
         LIST list_inter;
          // traitements permettant de calculer list_inter
     
     
          return new MFDPOSS(&list_inter);
        }
    Oui, mais je perd les avantages des pointeurs...

    Je vais peut-etre me mettre aux pointeurs intelligents, alors!
    Pourquoi tout le monde conseille les pointeurs intelligents "boost" mais que dans les exemples, ce sont les pointeurs intelligents "std::auto_ptr" qui sont le plus souvent utilisé?

    Merci encore pour vos réponses!

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 671
    Points
    10 671
    Billets dans le blog
    3
    Par défaut
    L'avantage c'est que tu es garanti de sa libération, même en cas d'exception avant d'atteindre le return.

    http://c.developpez.com/faq/cpp/?pag...NTEURS_autoptr

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Il vaut peut-etre mieux que j'utilise les pointeurs intelligents boost, alors?

    http://c.developpez.com/faq/cpp/?pag...oost_smart_ptr

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    MFDPOSS* intersectionMF(MFDPOSS *tmpdposs)
        {
          std::auto_ptr<LIST> list_inter;
          list_inter = new LIST;
     
          // traitements permettant de calculer list_inter
     
     
          return new MFDPOSS(list_inter.get());
        }
    on fait un list_inter.get() sur un pointeur, c'est la syntaxe? le .get, c'est nécessaire parcequ'on utilise des pointeurs intelligents? C'est embetant si la syntaxe change pour les pointeurs intelligents...

    Dernière question : l'utilisation conjointe de pointeurs "normaux" et de pointeurs intelligents ne pose elle pas de problèmes?

    (Je commence à regarder la doc des pointeurs intelligents...)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/05/2015, 17h49
  2. [Java] Quel OS est utilisé dans les entreprises ?
    Par vinou33 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 12/02/2015, 09h56
  3. Réponses: 10
    Dernier message: 22/01/2015, 19h46
  4. Réponses: 0
    Dernier message: 08/06/2012, 11h52
  5. Réponses: 0
    Dernier message: 04/06/2008, 22h12

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