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 :

Problème de gestion de mémoire


Sujet :

MFC

  1. #1
    Membre du Club Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Points : 47
    Points
    47
    Par défaut Problème de gestion de mémoire
    Bonjour,

    J'ai un objet CArray<char*> cRead, que je rempli normalement, avec des char* alloués dynamiquement.

    Lors que je quitte le programme, le débogueur visual m'indique que j'ai des fuites mémoires, les pointeurs char* de mon CArray n'ont pas été détruit.

    Alors je rajoute dans le destructeur de ma classe qui contient cRead, ceci:

    for(int i=0; i<cRead.GetCount(); i++) {
    delete(cRead.GetAt(i));
    }

    ça compile, ça s'exécute. Mais le débogueur de visual m'indique que j'ai toujours mon char* présent en mémoire, mais qu'une dizaine de nouvelles fuites ont été découvertes...

    Si quelqu'un pouvait m'aider

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    J'ignore si corriger cela résoudra tout, mais tu n'utilise pas le bon delete.
    Si tu as alloué tes tableaux de caractères avec new[], tu dois utiliser delete[].

    ...Et j'ajouterais un cRead.RemoveAll() explicite après la boucle for.

  3. #3
    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
    ça serait du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            delete []cRead.GetAt(i);
    sans les parenthèses sur le delete.

  4. #4
    Membre du Club Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    Oui, j'y ai pensé aussi au delete[], mais ça ne change rien, j'ai le même résultat.

    Ce que j'ajoute c'est ceci:
    char *filename = new char[pathName.GetLength()];
    ...
    cRead.Add(filename);


    Et, voici ce que j'obtiens avec SANS delete et mais AVEC removeAll() après le for :

    Detected memory leaks!
    Dumping objects ->
    f:\documents and settings\baud\mes documents\scol\l3\ihm\projet\player\player\playerdlg.cpp(467) : {164} normal block at 0x003599A0, 54 bytes long.
    Data: <F:\Documents and> 46 3A 5C 44 6F 63 75 6D 65 6E 74 73 20 61 6E 64
    Object dump complete.


    (autant de memories leaks que de ligne dans le CArray).



    Ceci AVEC delete[] et AVEC removeAll():

    Detected memory leaks!
    Dumping objects ->
    f:\program files\microsoft visual studio 8\vc\atlmfc\include\afxtempl.h(406) : {175} normal block at 0x00359A18, 4 bytes long.
    Data: < 5 > A0 99 35 00
    f:\documents and settings\baud\mes documents\scol\l3\ihm\projet\player\player\playerdlg.cpp(467) : {163} normal block at 0x003599A0, 54 bytes long.
    Data: <F:\Documents and> 46 3A 5C 44 6F 63 75 6D 65 6E 74 73 20 61 6E 64
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {146} normal block at 0x0035EA68, 128 bytes long.
    Data: <| Ox7 7 > 7C D9 4F 78 37 00 00 00 37 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {145} normal block at 0x0035E978, 178 bytes long.
    Data: <| OxP P > 7C D9 4F 78 50 00 00 00 50 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {144} normal block at 0x0035E8D0, 102 bytes long.
    Data: <| Ox* * > 7C D9 4F 78 2A 00 00 00 2A 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {143} normal block at 0x0035E840, 82 bytes long.
    Data: <| Ox > 7C D9 4F 78 20 00 00 00 20 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {142} normal block at 0x0035E768, 152 bytes long.
    Data: <| OxC C > 7C D9 4F 78 43 00 00 00 43 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {141} normal block at 0x0035E6B8, 114 bytes long.
    Data: <| Ox0 0 > 7C D9 4F 78 30 00 00 00 30 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {140} normal block at 0x0035E5F8, 128 bytes long.
    Data: <| Ox7 7 > 7C D9 4F 78 37 00 00 00 37 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {139} normal block at 0x0035A828, 52 bytes long.
    Data: <| Ox > 7C D9 4F 78 11 00 00 00 11 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {138} normal block at 0x0035E568, 82 bytes long.
    Data: <| Ox > 7C D9 4F 78 20 00 00 00 20 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {137} normal block at 0x0035A7A0, 76 bytes long.
    Data: <| Ox > 7C D9 4F 78 1D 00 00 00 1D 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {136} normal block at 0x0035A728, 54 bytes long.
    Data: <| Ox > 7C D9 4F 78 12 00 00 00 12 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {135} normal block at 0x0035A690, 92 bytes long.
    Data: <| Ox% % > 7C D9 4F 78 25 00 00 00 25 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {134} normal block at 0x0035A5E8, 108 bytes long.
    Data: <| Ox- - > 7C D9 4F 78 2D 00 00 00 2D 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {133} normal block at 0x0035A4E8, 196 bytes long.
    Data: <| OxY Y > 7C D9 4F 78 59 00 00 00 59 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {132} normal block at 0x0035A470, 58 bytes long.
    Data: <| Ox > 7C D9 4F 78 14 00 00 00 14 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {131} normal block at 0x0035A338, 246 bytes long.
    Data: <| Oxr r > 7C D9 4F 78 72 00 00 00 72 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {130} normal block at 0x0035A298, 96 bytes long.
    Data: <| Ox' ' > 7C D9 4F 78 27 00 00 00 27 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {129} normal block at 0x0035A1B0, 166 bytes long.
    Data: <| OxJ J > 7C D9 4F 78 4A 00 00 00 4A 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {128} normal block at 0x0035A0D8, 154 bytes long.
    Data: <| OxD D > 7C D9 4F 78 44 00 00 00 44 00 00 00 01 00 00 00
    f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {127} normal block at 0x0035A068, 50 bytes long.
    Data: <| Ox > 7C D9 4F 78 10 00 00 00 10 00 00 00 01 00 00 00
    Object dump complete.


    Pourtant j'ai utilisé le programme de la même façon.

  5. #5
    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,
    montre nous la déclaration et l'insertion des éléments dans cread.
    note que ton allocation n'est pas correcte , il te faut reserver un octet de plus pour le \0.
    il y a moyen simple de stocker des chaines dans un Carray sans se poser de question, c'est de mettre des CString.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CArray<CString ,const char *> cread;

  6. #6
    Membre du Club Avatar de Baud10
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Points : 47
    Points
    47
    Par défaut
    si je stock des CString, ça ne m'arrange pas, car j'utilise une librairie qui travaille avec des char*, et donc si je lui passe des CString... et puis extraire le char* d'une CString c'est pas commode...

    Parfait!

    J'ai complètement zappé que mon allocation était mal faite (j'ai oublié un octet pour le caractère de fin de chaine), et qui, lors d'un delete[] (char*) va supprimer tout en mémoire jusqu'a rencontrer un '\0' qu'il croit appartenir à la char* (dans la limite que ces zones mémoires ont été allouées au programme), d'où des memory leaks partout, le delete foireux a débordé sur d'autres variables, qui n'ont peu être détruites correctement.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Ta bibliothèque travaille avec des char* ou des const char * ?
    Dans le second cas, des CString en mode non-unicode (ou bien des CStringA si tu as un Visual récent) marcheront très bien...

    Et à ma connaissance, delete[] ne fait pas de strlen(). Par contre, si tu as oublié la place pour le \0 lors de l'allocation, c'est tout ce qui a été fait entre le new[] et le delete[] qui a du bien corrompre le tas...

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

Discussions similaires

  1. Problème de gestion de mémoire
    Par BernardBouree dans le forum VB.NET
    Réponses: 2
    Dernier message: 12/06/2015, 18h18
  2. Problème de gestion de mémoire ?
    Par sana_d dans le forum Langage
    Réponses: 4
    Dernier message: 08/03/2013, 23h17
  3. [Tomcat] Problème de gestion de mémoire
    Par tvcinq dans le forum Eclipse
    Réponses: 0
    Dernier message: 31/12/2009, 09h45
  4. Problème de gestion de mémoire - grosses matrices
    Par julesu dans le forum Fortran
    Réponses: 9
    Dernier message: 26/05/2008, 11h04
  5. Problème de gestion de mémoire (segfault)
    Par Michaël dans le forum C
    Réponses: 7
    Dernier message: 26/05/2007, 09h30

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