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

MFC Discussion :

CString et fuite mémoire


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut CString et fuite mémoire
    Bonjour à tous,

    j'ai un collègue qui obtient une fuite mémoire sur ce code, et je ne parviens pas à comprendre d'où cela peut venir:
    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
    void MyClass::ReadLine(CString& value)
    {
        this->aStdioFile->ReadString(value); 
    }
     
    void MyClass::readData(CString& block)
    {
        CString aLine;
     
        if( !block.IsEmpty()) block.Empty();
        do
        {
            ReadLine(aLine);
            block += aLine;  
        }while(aLine.GetLength() != 1);
     }
    Je trouve que ce code pourrait être 'épuré', mais je ne comprends pas d'où viens cette fuite.
    Une idée?

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    ce n'est pas la CString qui cause une fuite ,sauf si on utilise un pointeur sur CString et qu'il n'est pas relaché .
    et dans le code montré il n'y a pas de pointeur donc l'erreur vient d'ailleurs.
    voir plutot du cote de aStdioFile..

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Ok, je vais voir ça.
    Merci.

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Bon, après examen, il apparait que:
    1/ Il n'y a pas de fuite mémoire. C'est juste une mauvaise utilisation de la mémoire.
    2/ Le problème ne vient pas des CString, mais d'un CStdioFile. (encore une fois, tu avais raison farscape )

    D'ailleurs, j'aurais aimé avoir votre avis concernant ce problème:

    L'appli reçoit un flux de données, et le récupère dans un CStdioFile, ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FILE* aStream;
    CStdioFile* aStdioFile;
    ctrfHandle = _open_osfhandle((long)aHandle, 0);
     
    if( (aStream = _fdopen(ctrfHandle, "r")) != NULL)   
            aStdioFile = new CStdioFile(aStream);
    Ensuite, le contenu du CStdioFile est lu et traité dans un autre thread. Or, il semble que le aStdioFile gonfle sans limites. Je n'en suis pas encore sûr à 100%, mais cela me parait logique, puisqu'il reçoit des données non stop qui ne sont jamais désallouées.

    Ma question est: comment faire pour éviter ça?

    Merci.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Question bête : il est où le delete ?

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Il(s) est(sont) après la boucle.

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    il n'y a rien qui me choque la dedans ...
    ouvrir un CStdioFile d'apres un FILE * ,il n' y a pas plus d'allocations que ça .
    vu que a priori le setvbuf est deja fait pas fopen ..
    non je ne vois pas de raison de perdre de la memoire.
    sauf a se melanger les pointeurs.
    mets un affichage TRACE("CStdioFile :%X",aStdioFile); a l'ouverture
    et le même a la fermeture .
    c'est le meme objet ?

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    TRACE("CStdioFile :%X",aStdioFile); c'est quoi qui est affiché par ce code? J'obtiens ça: 325498. Le même tout le temps.

    En revanche, j'ai quelque chose d'étrange à vous soumettre:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    class Test
    {
    ...
    void f(CString &str);
    void run();
    CStdioFile* m_pFile;
    }
     
    void Test::f(CString &str)
    {
    	CString strLine;
    	int i = 0;
    	while ( (i<10000) && m_pFile->ReadString(strLine) != NULL )
    	{
    		str+=strLine;
    		i++;
    	}
    }
     
    void Test::run()
    {
    	CString strBloc;
    	m_pFile = new CStdioFile("C:\\temp\\testtxt.txt", CFile::modeRead);
     
    	for (int i=0; i<10000; i++)
    	{
    		f(strBloc); // <-------- break point ici
    	}
    }
    A l'endroit du break point, je regarde ce que vaut strBloc. Et ce qui est surprenant, c'est que son adresse n'est jamais identique d'un appel à l'autre!
    i=0: strBloc {0x7c329cec ""} ...
    i=1: strBloc {0x011c0050 "20060118 - 14:26:24 -- 0 -- 0x0 ...
    etc...

    Est-ce normal?

    [edit]J'ai corrigé des erreurs de copier/coller dans le code [/edit]

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par r0d
    A l'endroit du break point, je regarde ce que vaut strBloc. Et ce qui est surprenant, c'est que son adresse n'est jamais identique d'un appel à l'autre!
    i=0: strBloc {0x7c329cec ""} ...
    i=1: strBloc {0x011c0050 "20060118 - 14:26:24 -- 0 -- 0x0 ...
    etc...

    Est-ce normal?
    Ce que j'en pense c'est qu'en fait tu ne travailles pas avec des pointeurs, donc la notion d'adresse avec le débogueur me paraît plus subtil (j'ai pas fait le test pour connaître son comportement).
    Je trouve ca donc normal. Il suffit qu'il y ait une surcharge sur l'opérateur + : on ne sait pas ce qu'il y a derrière.
    voir: strBloc+=strLine;

    De plus, si j'analyse ton code et que tu passes en paramètre une CString, ne serait-ce pas: str+=strLine; ?

  10. #10
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Ok. Mais du coup, j'ai tenté autre chose: f() va me revoyer une CString et ne prends rien en paramètre. Et je fais strBlock+=f();
    Et là, l'adresse de strBlock ne change plus ^^

    J'ai corrigé l'erreur sur str+=...

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. Réponses: 1
    Dernier message: 02/12/2005, 14h18
  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