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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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...

+ 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