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 :

std::string et fuite de mémoire


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut std::string et fuite de mémoire
    Bonjour,

    Je programme avec Visual Studio Express 2005.

    J'ai installé Visual Leak Detector, un detecteur de fuite de mémoire... efficace !

    Du coup j'ai pu corriger quelques fuites, mais une derniere me laisse perplexe.

    J'ai une classe cListe qui peut contenir des elements.

    On ajoute un élément avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int m_valeur;
    std::string m_texte;
     
    void ajouterElement(int valeur, std::string texte)
    {
        m_valeur = valeur;
        m_texte = texte;
    }
    Et j'ai une fuite sur certains éléments créés, indiquée sur la ligne

    m_texte = texte;

    J'ai donc pensé que je ne libérais pas la mémoire de certaines string... pour vérifier, j'ai codé en dur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    pListe->ajouterElement(0, "test 1");
    pListe->ajouterElement(0, "test 2");
    pListe->ajouterElement(0, "test 33333333333333333333");
    pListe->ajouterElement(0, "test 4");
    pListe->ajouterElement(0, "test 5");
    Et là, j'ai une fuite de mémoire systématique dans l'éxecution de :

    pListe->ajouterElement(0, "test 33333333333333333333");

    Comme si la longueur de la chaine posait probleme....

    Je m'y prend mal avec les std::string ?

    Merci !

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    La fuite est vraisemblablement en amont, sans doute que tu ajoutes un élément dans la liste mais tu ne le détruits jamais.
    Du coup oui, techniquement ce qui fuit c'est le tampon interne de std::string, mais en fait il faut regarder l'objet qui possède la std::string.

    Une autre possibilité est que VLD hallucine, mais je l'ai un peu utilisé et il a l'air assez fiable quand même...

    MAT.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    La fuite est vraisemblablement en amont, sans doute que tu ajoutes un élément dans la liste mais tu ne le détruits jamais.
    Je ne crois franchement pas, car je ne detruit pas les elements de la liste "à la main"

    Ils sont tous détruits par une boucle dans le destructeur de la liste.

    Et les seuls elements sur lesquels il y a fuite de mémoire ce sont les éléments avec une chaine "un peu plus longue"

    Donc je comprend pas vraiment... et j'ai un peu de mal à mettre en doute les std::string...

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Et si tu passais tes paramètres par référence??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void ajouterElement(const int & valeur, const std::string & texte)
    {
        m_valeur = valeur;
        m_texte = texte;
    }

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Par défaut
    T'as essayer de faire un petit programme qui ne fait que créer cette chaine longue. Puis tu verifies si fuite.
    Puis un petit prog qui cré et ajoute cette longue chaine à la liste et tu verifies si fuite...
    Ca te donnera une idée de la provenance du bug. std::string ou plus en amont, genre ta list qui est pas bien initialisée...

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Ben je vois pas trop pourquoi ça changerait quelque chose...

    A moins qu'il y ait une façon de proceder particuliere avec les string ?

  7. #7
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Euh, le message d'avant c'etait pour poukill...

    fredwilli : oui, effectivement, j'ai pas encore fais de test plus "decomposé" je testerais ce soir...

    Je voualis surtout savoir s'il n'y a pas un probleme connu autour de ça...

  8. #8
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    les string de VC++ de font un malloc qu'a partir d'une certaine longueur (15 je crois). Mais a priori y'a pas de fuite, c'est juste ton outil qui déconne.
    http://c.developpez.com/faq/cpp/?pag...MES_STL_fuites
    tu peux checker avec le mécanisme de la CRT pour etre sur.
    http://msdn2.microsoft.com/en-us/lib...cf(VS.80).aspx

  9. #9
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Merci pour l'info !

    Mais Visual Leak Detector est, je crois, basé sur les mécanismes de la CRT...

    Par contre, si il déconne, ça ne m'arrange pas.... car pour le moment je lui fait une confiance quasi-aveugle...

    Sinon, y-a-t-il d'autres outils du même type, faciles à installer et à utiliser avec Visual Studio Express ?

    (ce que j'aime bien avec VLD, c'est qu'il y a juste à inserer les en-tete, il s'occupe de tout...)

  10. #10
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155

  11. #11
    Expert confirmé

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    je ne crois pas que valgrind fonctionne sous windows.

    De ce que j'en ai entendu, a peu pres tous les outils de detection de fuites émettent de fausses alertes, y compris ceux qui se vendent assez cher (genre Purify). Les strings sont un cas typiques, parce qu'elles sont souvent gérées de maniere assez complexes pour optimiser les perfs.

    S'il ne t'indique qu'une seule fuite au niveau de ta std::string, je pense que tu peux ignorer...

  12. #12
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Ok, merci pour toutes ces infos.

  13. #13
    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
    Tu appelles bien delete sur chacun des noeuds de ta liste ?

  14. #14
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Oui oui, je fais bien un delete à chaque fois.

    D'ailleurs, il n'y a qu'avec des chaines "longues" que j'ai une fuite. Si je met que des courtes, pas de fuite...

    CQFD...

  15. #15
    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
    C'est peut-être tout simplement ton implémentation de std::string qui ne libère pas la mémoire afin de pouvoir la réutiliser ultérieurement.

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 26
    Par défaut
    J'ai déjà eu des fuites mémoires réccurentes dans std::string avec purify. (sous Solaris). Je confirme l'efficacité relative de ces produits.

    Juste une question, est-ce que ton progamme plante?

  17. #17
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Non, mon programme ne plante pas...

    A priori, je pencherais plutot pour un truc du genre :

    C'est peut-être tout simplement ton implémentation de std::string qui ne libère pas la mémoire afin de pouvoir la réutiliser ultérieurement.
    Même si ça m'étonne que la mémoire ne soit pas libérée après la fin de l'éxecution du programme....

    Et que je n'ai des fuites que sur des chaines de plus d'une dizaine de caractères...

  18. #18
    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
    Et que je n'ai des fuites que sur des chaines de plus d'une dizaine de caractères...
    Ton implémentation fait peut-être aussi de la Small String Optimization, c'est à dire que l'objet std::string contient un tableau d'une taille fixe N où est mise la chaîne si elle est suffisamment petite, et que sinon std::string utilise de l'allocation dynamique.

    Même si ça m'étonne que la mémoire ne soit pas libérée après la fin de l'éxecution du programme....
    Quand un processus se termine la mémoire qu'il utilisait est forcément récupérée par l'OS. Il ne sert donc à rien de libérer la mémoire à la fin du programme, si ce n'est à perdre du temps.

  19. #19
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Ok, ceci explique donc surement cela !

    Merci !

  20. #20
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    juste une question ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <string>
     
    int main()
    {
      std::string abc = "abcdefghijklmnopqrstuvwxyz";
      return 0
    }
    Il te fait une fuite de mémoire là aussi?

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

Discussions similaires

  1. std::string -> liberation mémoire
    Par Astraya dans le forum C++
    Réponses: 5
    Dernier message: 01/02/2011, 15h38
  2. [STL]string, fuites de mémoires
    Par anasama dans le forum SL & STL
    Réponses: 8
    Dernier message: 18/05/2006, 08h58
  3. cannot convert 'std::string' to 'System::String ^'
    Par broadhead dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 11h37
  4. std::string, operator =
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 05/11/2004, 12h07
  5. Réponses: 8
    Dernier message: 17/10/2002, 12h52

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