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 :

Fuites mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut Fuites mémoire
    Bonjour à tous,

    J'aimerais savoir si le code suivant produit des fuites mémoires:

    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
     
     
    void CBase::DoSomeThing()
    {  
      CString* pMyString;
      pMyString = new CString();
      pMyString->Empty();
     
      *pMyString = returnastring();
     
      // store pMyString in a Vector that will be freed by CBase::~Dtor..
     
    }
     
    CString CBase::returnastring()
    {
      CString justastring;
      justastring = "Kikoo Dvp";
     
      return justastring;
    }
    Pour moi il en produit mais je ne sais pas comment adapter celà.
    De même, pour la fonction "returnastring", est ce autorisé ce genre d'écriture?? je veux dire, retourner une variable locale et la stocker dans un vecteur qui sera utilisé bien après la mort de la fonction (et donc du destructeur de la cstring locale?)?

    Je dois pas être super bien réveillé, j'ai vraiment du mal avec cette partie..

    S'il faut des précisions, n'hésitez pas

    François

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par squale32 Voir le message
    J'aimerais savoir si le code suivant produit des fuites mémoires
    oui.
    A chaque new doit correspondre un delete.
    Citation Envoyé par squale32 Voir le message
    De même, pour la fonction "returnastring", est ce autorisé ce genre d'écriture?? je veux dire, retourner une variable locale et la stocker dans un vecteur qui sera utilisé bien après la mort de la fonction (et donc du destructeur de la cstring locale?)?
    Oui. C'est une copie qui va être renvoyée.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    oui.
    A chaque new doit correspondre un delete.Oui. C'est une copie qui va être renvoyée.

    Le delete qui correspond au new se trouve plus loin dans le programme. (pointeur stocké dans un vecteur et libéré tout à la fin).

    Quant à la copie retournée, doit-elle est libérée à l'aide d'un delete?


    J'aimerais en fait savoir si à la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *pMyString = returnastring();
    ... savoir si une deuxième CString est créée ou pas et si je perds le résultat du new 2 lignes plus haut??

    en bref, savoir si à part le delete dans le vector, j'ai autre chose à libérer.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par squale32 Voir le message
    Le delete qui correspond au new se trouve plus loin dans le programme. (pointeur stocké dans un vecteur et libéré tout à la fin).
    Si tu es sensible aux fuites mémoire, je te suggère de lire l'article sur les pointeurs intelligents.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Me revoici, désolé pour le temps de réponse...

    Merci pour l'article oodini, je l'avais déjà lu et le trouve effectivement très intéressant, mais malheureusement inapplicable dans le cas qui m'occupe (Projet professionnel avec des vilains délais à tenir ).
    ..Ce code faisant partie des nombreuses portions de code que j'ai à vérifier..

    Sinon, concernant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      CString myString(returnastring());
    cela se trouve dans une boucle et les strings résultantes sont stockées dans un vector qui sera utilisé plus tard dans une autre fonction.
    le new est donc obligatoire je pense ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void CBase::DoSomeThing()
    {
      while (plusrienafaire)
      {
        CString myString(returnastring());
     
        myVector.push_back( & myString);
      }
     
      // ici mon vecteur ne contient plus rien de bon :/
     
    }
    Dû au nombre de ligne codées autour cette fonction, je ne peux me permettre de changer mon vecteur pour qu'il accepte directement les CString et non plus des pointeurs de cstring..
    De toute façon, niveau occupation mémoire, il est plus intéressant de stocker les pointeurs..

  6. #6
    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
    Par défaut
    Citation Envoyé par squale32 Voir le message
    Bonjour à tous,
    Bonjour à toi,

    Citation Envoyé par squale32 Voir le message
    J'aimerais savoir si le code suivant produit des fuites mémoires:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    void CBase::DoSomeThing()
    {  
      CString* pMyString;
      pMyString = new CString();
      pMyString->Empty();
     
      *pMyString = returnastring();
     
      // store pMyString in a Vector that will be freed by CBase::~Dtor..
     
    }
    Tout dépend ce que tu entend par 'store pMyString in a Vector that will be freed by CBase::~Dtor..'. Sur ta fonction, telle que tu la donnes, le pointeur pMyString est perdu, en toute logique il manque un delete. Mais si tu as omis un bout de code (store blablabla), peut être que le pointeur est mémorisé ailleurs.
    Citation Envoyé par squale32 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CString CBase::returnastring()
    {
      CString justastring;
      justastring = "Kikoo Dvp";
     
      return justastring;
    }
    Pour moi il en produit mais je ne sais pas comment adapter celà.
    De même, pour la fonction "returnastring", est ce autorisé ce genre d'écriture?? je veux dire, retourner une variable locale et la stocker dans un vecteur qui sera utilisé bien après la mort de la fonction (et donc du destructeur de la cstring locale?)?
    Ici, tu ne retourne pas une variable locale mais une copie de cette variable (car ton type de retour est CString et non pas CString&, ou CString*). Donc, pas de soucis. Si tu traces au debugger, tu verras qu'à l'instruction 'return justastring;', tu vas passer d'abord dans le copy-constructeur (pour construrie ta variable de retour), puis dans le destructeur (destruction de ta variable locale justastring). Si tu regardes plus attentivement l'implémentation MFC des CString, tu verras comment la chaîne de caractère est effectivement gérée.

  7. #7
    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
    remplace
    CString* pMyString;
    pMyString = new CString();
    pMyString->Empty();

    *pMyString = returnastring();
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CString myString = returnastring();
    Mais à mon avis, y'a des problèmes encore plus graves dans ton code.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ou mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CString myString(returnastring());
    Ça évitera la construction d'un objet à vide.

  9. #9
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Citation Envoyé par oodini Voir le message
    Ou mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CString myString(returnastring());
    Ça évitera la construction d'un objet à vide.
    Il me semble que c'est équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CString myString = returnastring();
    Pour autant que je me souvienne, l'instruction combinant déclaration et initialisation, c'est directement un appel au constructeur qui est réalisé, et non un création à vide puis l'opérateur d'affectation.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Oui. J'avais cru voir une paire de () myString.

    Mea culpa.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Bonjour à toi,


    Tout dépend ce que tu entend par 'store pMyString in a Vector that will be freed by CBase::~Dtor..'. Sur ta fonction, telle que tu la donnes, le pointeur pMyString est perdu, en toute logique il manque un delete. Mais si tu as omis un bout de code (store blablabla), peut être que le pointeur est mémorisé ailleurs.
    remplacer le commentaire par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      myVector.push_back(pMyString);
     
    }
    Et alors effectivement, à la fin du programme, je boucle dans mon vecteur, j'extrais le pointeur et je le delete. Donc par rapport à cela je pense que je suis bon.

    Ici, tu ne retourne pas une variable locale mais une copie de cette variable (car ton type de retour est CString et non pas CString&, ou CString*). Donc, pas de soucis. Si tu traces au debugger, tu verras qu'à l'instruction 'return justastring;', tu vas passer d'abord dans le copy-constructeur (pour construrie ta variable de retour), puis dans le destructeur (destruction de ta variable locale justastring). Si tu regardes plus attentivement l'implémentation MFC des CString, tu verras comment la chaîne de caractère est effectivement gérée.
    Construction qui nécessite un delete?

    C'est là que se trouve réellement mon problème (au fond de ma tête j'en suis conscient..).

    Il a donc bien 2 allocations à libérer si je comprends bien ce que tu me dis?

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

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. [Fuites mémoire] Je cherche un utilitaire
    Par 10_GOTO_10 dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/02/2005, 10h03
  3. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  4. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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