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

Visual C++ Discussion :

Fuites mémoires : comment trouver


Sujet :

Visual C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut Fuites mémoires : comment trouver
    Bonjour,

    J'ai un gros programme qui n'est pas à moi et qui termine par plein de fuites mémoires.
    Ca fait 1.5 jours que je vérifie manuellement qu'il y a bien des delete pour tous les nouveaux objets réées par new (pas de malloc / free dans le code).
    Pourtant, rien à faire, je ne vois pas où il peut y avoir ces fuites.

    Malheureusement, je n'ai que ça comme indications à la fin :
    Detected memory leaks!
    Dumping objects ->
    {28619331} normal block at 0x0D10DFF0, 1 bytes long.
    Data: < > 00
    {21835078} normal block at 0x0D014C40, 13 bytes long.
    Data: <NL0000361947 > 4E 4C 30 30 30 30 33 36 31 39 34 37 00
    {21835072} normal block at 0x0D014CF0, 1 bytes long.
    Data: < > 00

    Ce qui ne me dit pas où trouver l'erreur.

    Miracle, dans la MSDN, je vois quelque chose SENSE me fournir plus d'indications :
    ajouter :
    #define _CRTDBG_MAP_ALLOC
    #include <stdlib.h>
    #include <crtdbg.h>

    et terminer le programme par _CrtDumpMemoryLeaks();
    Ca ne fait rien de mieux (surement parce que ça ne s'applique qu'à malloc/free).

    Au secours!

  2. #2
    Membre expérimenté

    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
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Tu peux peut-être essayer d'utiliser Visual Leak Detector, ça fait quelque temps que je ne l'ai plus utilisé, mais dans mes souvenirs ça donnait des informations assez précises sur les emplacements des new fautifs.

    Sinon il faudrait utiliser des std::auto_ptr, boost::shared_ptr, etc.. d'une façon générale, mais c'est sûr que sur un code existant c'est lourd à mettre en place...

    MAT.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Merci.

    J'ai utilessayé 2 fois la première méthode, mais avec la chance que j'ai :

    mon programme tournait avant en 3-4 minutes.
    Au bout de 10 mn en incluant son outil, ça tourne toujours, puis l'ordinateur m'avertit que j'ai presque plus de mémoire virtuelle, puis Unhandled exception...Access Violation et Visual saute!
    Ca n'a pas l'air tout à fait au point leur outil.

  4. #4
    Membre expérimenté

    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
    Points : 1 543
    Points
    1 543
    Par défaut
    T'as pas moyen de ne lancer qu'une petite partie de ton application, avec si possible un jeu de données réduit par exemple, dans un premier temps ?

    MAT.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Non, trop grosse fonction, c'est très compliqué d'isoler certaines parties, c'est écrit n'importe comment!

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Pas d'autre moyen alors?

  7. #7
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    bah moi à l'époque, je double cliquais sur la ligne de message d'erreur et ca me renvoyais sur la déclaration non libérée (comme sur le debugger)

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par la drogue c'est mal
    bah moi à l'époque, je double cliquais sur la ligne de message d'erreur et ca me renvoyais sur la déclaration non libérée (comme sur le debugger)
    Moi pas (Visual 6)

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Et c'est incroyable que quand j'utilise des bibliothèques faites pour ça, ça me plante le programme!!!!!

    #include <crtdbg.h>
    #include <dbgnew.h>

    #ifdef _DEBUG
    #define new DEBUG_CLIENTBLOCK
    #endif


    -->le programme plante en cours de route avant même que je puisse appeler
    _CrtMemDumpAllObjectsSince(NULL);


  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 stof
    Moi pas (Visual 6)
    si ce n'est pas le cas c'est qu'il te manque dans tes sources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    #include "stdafx.h"
     
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    le bloc ifdef _DEBUG...

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Désolé de répondre si tard mais entre temps j'ai fait d'autres choses mais je suis pas plus avancé sur ce problème :

    J'ai un problème dès l'inclusion de stdafx.h



    Mais voilà ce que ça fait à la compilatioon pour commencer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    c:\program files\microsoft visual studio\vc98\include\oaidl.h(710) : error C2059: syntax error : ';'
    c:\program files\microsoft visual studio\vc98\include\oaidl.h(736) : warning C4229: anachronism used : modifiers on data are ignored
    c:\program files\microsoft visual studio\vc98\include\oaidl.h(736) : error C2501: 'callconv' : missing storage-class or type specifiers
    c:\program files\microsoft visual studio\vc98\include\urlmon.h(3357) : warning C4003: not enough actual parameters for macro 'ReportResult'
    c:\program files\microsoft visual studio\vc98\include\urlmon.h(3357) : error C2059: syntax error : '('
    c:\program files\microsoft visual studio\vc98\include\urlmon.h(3357) : error C2238: unexpected token(s) preceding ';'
    c:\program files\microsoft visual studio\vc98\include\oleauto.h(754) : warning C4229: anachronism used : modifiers on data are ignored
    c:\program files\microsoft visual studio\vc98\include\oleauto.h(754) : error C2501: 'cc' : missing storage-class or type specifiers
    c:\program files\microsoft visual studio\vc98\include\oleauto.h(798) : error C2059: syntax error : '__stdcall'
    c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(3612) : warning C4229: anachronism used : modifiers on data are ignored
    c:\program files\microsoft visual studio\vc98\atl\include\atlcom.h(3612) : error C2501: 'cc' : missing storage-class or type specifiers

    EDIT : ça passe sans en fait

  12. #12
    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
    je ne parlai pas de stdafx.h ... , mais du bloc ifdef _DEBUG ...

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Bon, ça change rien le bloc #ifdef _DEBUG, j'ai toujours les mêmes informations incompréhensibles :

    Detected memory leaks!
    Dumping objects ->
    {15776933} normal block at 0x0C948D60, 13 bytes long.
    Data: <QS0002779138 > 51 53 30 30 30 32 37 37 39 31 33 38 00
    {15776927} normal block at 0x0C949990, 1 bytes long.
    Data: < > 00
    {15776926} normal block at 0x0C949BD0, 4 bytes long.
    Data: < > 90 99 94 0C

    etc


    PS : j'ai mis le bloc en hait du source qui contient le main : faut-il en metytre dans tous les cpp utilisés pour que ça donne quelque chose?

  14. #14
    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 stof
    Bon, ça change rien le bloc #ifdef _DEBUG, j'ai toujours les mêmes informations incompréhensibles :

    Detected memory leaks!
    Dumping objects ->
    {15776933} normal block at 0x0C948D60, 13 bytes long.
    Data: <QS0002779138 > 51 53 30 30 30 32 37 37 39 31 33 38 00
    {15776927} normal block at 0x0C949990, 1 bytes long.
    Data: < > 00
    {15776926} normal block at 0x0C949BD0, 4 bytes long.
    Data: < > 90 99 94 0C

    etc


    PS : j'ai mis le bloc en hait du source qui contient le main : faut-il en metytre dans tous les cpp utilisés pour que ça donne quelque chose?
    ben oui....

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    Bon, je sens que je vais commencer à agacer à patauger comme ça :

    j'en ai mis dans tus les sources inclus dans mon projets...qui le veulent bien parce que dans d'autre, ça fait error C2065: 'DEBUG_NEW' : undeclared identifier à la compilation...

    Effectivement, un des fichiers m'a aiguillé sur le problème.
    Pour le reste, ça doit être soit des sources "qui ne veulent pas accepter le bloc debug", soit d'autres fonctions appelées par l'intermédiaire de .h inclus dans le projet mais dont les sources ne sont pas mises dans le projet.

    Pfffff

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    759
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 759
    Points : 159
    Points
    159
    Par défaut
    ?

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Points : 33
    Points
    33
    Par défaut
    Bjr,
    J'ai le meme pb. As tu avancé dans tes recherches et peux tu m'en faire profiter ?
    merci.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/09/2010, 18h26
  2. perte de mémoire, comment la trouver ?
    Par Rniamo dans le forum Qt
    Réponses: 6
    Dernier message: 31/05/2009, 10h13
  3. Fuite mémoire, comment bien désallouer ?
    Par k3ops dans le forum OpenCV
    Réponses: 10
    Dernier message: 03/07/2008, 16h47
  4. comment détecter les fuites mémoires
    Par cyrille37 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 26/04/2008, 15h12
  5. Réponses: 19
    Dernier message: 04/10/2006, 16h53

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