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 :

[debug] fuites mémoires


Sujet :

MFC

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    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 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut [debug] fuites mémoires
    Bonjour à tous,

    j'ai récupéré une appli sur laquelle je dois travailler, et j'ai détecté quelques fuites mémoire à l'exécution (Detected memory leaks!). J'aurais besoin de conseils pour corriger ces fuites.

    J'ai commencé par vérifier que chaque objet créé était bien supprimé (à chaque new() correspond un delete). Mais je n'ai rien trouvé de ce côté-là. De plus, il y a des objets qui utilisent des pointeurs intelligents (donc le delete qui correspond à un new() n'est pas toujours facile à trouver).

    Je me disais donc qu'il doit bien exister des outils (gratuits, ou intégrés dans l'IDE visual7), des méthodes, des principes, etc. Bref, si vous avez des conseils à me donner, je suis tout ouïe

    Merci.

    [edit]Je viens d'essayer _CrtDumpMemoryLeaks() (cf. http://msdn.microsoft.com/library/fr...kdetection.asp)
    mais ça ne marche pas [/edit]

  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
    tu as l'info de la ligne dans le debug sur le memory leaks ?
    sinon verifies que tout les sources ont bien la macro:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif

  3. #3
    Membre régulier
    Inscrit en
    Février 2003
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 141
    Points : 95
    Points
    95
    Par défaut
    tu peux en dire un peu plus sur cette macro steuplè, ça m'a lair bien interressant

  4. #4
    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
    et bien en debug ça permet de re definir new pour pour disposer du systeme de trace des memory leaks ,on disposera ensuite de la ligne et du type d'objet ayant une fuite memoire .
    il suffira de faire un double clic dessus pour arriver sur l'allocation en question.
    sinon un objet interressant c'est CMemoryState qui permet à partir d'une situation de lister les allocations memoires en cours:
    exemple msdn:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // example for CMemoryState::CMemoryState
    // Includes all CMemoryState functions
    CMemoryState msOld;
    msOld.Checkpoint();
    CAge* page1 = new CAge( 21 );
    CAge* page2 = new CAge( 22 );
    msOld.DumpAllObjectsSince();
    The results from this program are as follows:
    Copy Code
    Dumping objects ->
    {2} a CObject at $190A
    {1} a CObject at $18EA
    Object dump complete.

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    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 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Citation Envoyé par farscape
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    [...]il suffira de faire un double clic dessus pour arriver sur l'allocation en question.
    Grrrr, ça ne marche pas!! J'ai bien l'info sur le memory leak:
    Citation Envoyé par output
    {15687} normal block at 0x086A10A8, 331776 bytes long.
    Data: < > 01 01 00 01 00 00 00 00 00 00 00 00 00 00 01 00
    Mais le double-clic ne m'amène pas à la ligne concernée. (Il doit me manquer quelque chose, mais quoi? )
    J'ai également essayé d'utiliser la fonction _CrtSetBreakAlloc(n); qui met un point d'arrêt à la n_ième allocation. Le problème, c'est que pour pouvoir utiliser cette fonction, il faut connaitre le numéro de l'allocation qui n'est pas libérée. Or, dans mon cas, ce ne sont pas les même numéros d'allocation d'une exécution à l'autre.

    J'espère que je suis suffisamment clair :
    Merci Farscape

  6. #6
    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,
    si tu n'as pas l'info de la ligne c'est que ce n'est pas le source en question qui cause probleme...
    attention aux eventuelles classe template qui feraient des allocations memoires.
    aux differentes lib inclues dans ton projet et pas forcemment en debug ou ne disposant pas de la macro citée...

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    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 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Je pense, en effet, que le problème viens de là: la solution sur laquelle je travaille est un véritable écheveau de libs. Certaines sont des projets de ma solution, certaines ne sont pas à moi.

    Cependant, j'ai un doute sur une allocation en paticulier (une classe qui est instanciée et qui doit être normalement détruite par une autre classe qui n'appartient pas à la même lib). Comment, alors que je sais quelle ligne est douteuse, en avoir le coeur net?

  8. #8
    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
    Attention aussi au probleme reccurent de la lib CRT utilisée par le programme avec les autres lib ( multi thread mono thread )..

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    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 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    ok,
    merci pour vos conseils.

  10. #10
    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
    Citation Envoyé par r0d
    ok,
    merci pour vos conseils.
    c'etait quoi ?

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    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 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par farscape
    Citation Envoyé par r0d
    ok,
    merci pour vos conseils.
    c'etait quoi ?
    Alors:
    j'avais un objet A qui contenait une liste (une fifo plus exactement) d'objets B. Pour remplir A, je devais d'abord créer un objet B et le passer à A (via un pointeur). Le problème venait du fait que les objets B que je passait à A étaient éffacés lors de la destruction de A. (pour info, les objets A et B n'appartiennent pas à la même lib), donc ce n'était pas moi qui avait la charge de les effacer. Et en plogeant un peu dans le code de mon objet A, je mem suis rendu compte que parfois, un des objet B n'était pas bien récupéré, donc forcément mal effacé lors de la destruction de A.

    voaaaaaaalà

+ 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. VC++6, mode debug et fuites mémoire
    Par Mucho dans le forum wxWidgets
    Réponses: 1
    Dernier message: 23/08/2006, 09h27
  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