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 :

Detecter les fuites mémoire


Sujet :

Visual C++

  1. #1
    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 Detecter les fuites mémoire
    Bonjour,
    J'ai récupérer le code d'un collègue, il est composé de plein de dll (lib).
    Je travail sous VC6 avec MFC. J'ai :
    - modifié les option de compilation pour y intégrer les info de debug.
    - Vérifié que toute les lib sont compilées avec les mêmes options (Debug Multithreaded dll)
    Bref je me suis assuré que tout est bien pile pint au point.

    Le projet compile et s'execcute. Mais j'ai une tonne de memory leak.
    Elles sont toutes du genre :
    strcore.cpp(118) : {17507182} normal block at 0x0003BE00, 32 bytes long.
    Data: < Pr t> 01 00 00 00 04 00 00 00 13 00 00 00 50 72 EA 74

    ou :
    {17501227} normal block at 0x0A2FCDC0, 25 bytes long.
    Data: <class CAD3Array2D> 63 6C 61 73 73 20 43 48 33 41 72 72 61 79 32 44

    ou :
    {17502764} normal block at 0x0175B000, 380 bytes long.
    Data: <& < @ @?> 26 1A A4 3C 00 00 C0 BF 00 00 40 BF 00 00 40 3F

    Celles que je site sont celle dont je n'ai pas accès dans code. Cad que si je clique sur la ligne, ou ca me renvois sur un fichier inconnu (strcore.cpp par exemple) ou alors il ne se passe rien.

    Mes questions sont les suivante :
    - Y a t'il un moyen de remonter à la ligne du code responsable de ces fuites ?
    - Comment interpréter les code qui accompagne une ML.

    Merci de votre aide.

  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,
    pour tracer les fuites il faut que le bloc suivant soit placé au sommet du source après stdafx.h
    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 faut aussi éviter les méthodes faisant des allocations mémoires inline dans le .h de la classe.

  3. #3
    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
    Le code que tu cite existe bien dans tous les code après le stdafx.
    il faut aussi éviter les méthodes faisant des allocations mémoires inline dans le .h de la classe.
    Ça par contre, je ne peux pas car le code utilise beaucoup de template genre :
    template <class TYPE >
    class CAD3Array2D:
    public CAD3Array < TYPE >
    TYPE pouvant être de l'entier, ou tout autre. Elle sont définies dans le .h.

  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
    il faut s'assurer que le .h du template soit inclut après les macros (essaye pour voir) ...

  5. #5
    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
    Non, en effet il inclu avant les macros, je fais la modif et te tien au courant

  6. #6
    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
    Olllla, ca m'a foutu une tonne d'erreurs du genre :
    c:\program files\microsoft visual studio\vc98\include\new(35) : error C2061: syntax error : identifier 'THIS_FILE'
    c:\program files\microsoft visual studio\vc98\include\new(35) : error C2091: function returns function
    c:\program files\microsoft visual studio\vc98\include\new(35) : error C2809: 'operator new' has no formal parameters
    c:\program files\microsoft visual studio\vc98\include\new(36) : error C2061: syntax error : identifier 'THIS_FILE'
    c:\program files\microsoft visual studio\vc98\include\new(37) : error C2091: function returns function
    c:\program files\microsoft visual studio\vc98\include\new(37) : error C2556: 'void *(__cdecl *__cdecl operator new(void))(unsigned int,const struct std::nothrow_t &)' : overloaded function differs only by return type from 'void *(__cdecl *__cdecl op
    erator new(void))(unsigned int)'
    c:\program files\microsoft visual studio\vc98\include\new(35) : see declaration of 'new'
    c:\program files\microsoft visual studio\vc98\include\new(41) : error C2061: syntax error : identifier 'THIS_FILE'
    c:\program files\microsoft visual studio\vc98\include\new(42) : error C2091: function returns function
    c:\program files\microsoft visual studio\vc98\include\new(42) : error C2556: 'void *(__cdecl *__cdecl operator new(void))(unsigned int,void *)' : overloaded function differs only by return type from 'void *(__cdecl *__cdecl operator new(void))(unsig
    ned int)'
    c:\program files\microsoft visual studio\vc98\include\new(35) : see declaration of 'new'
    c:\program files\microsoft visual studio\vc98\include\new(42) : error C2809: 'operator new' has no formal parameters
    c:\program files\microsoft visual studio\vc98\include\new(42) : error C2065: '_P' : undeclared identifier
    c:\program files\microsoft visual studio\vc98\include\memory(16) : error C2061: syntax error : identifier 'THIS_FILE'
    c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2091: function returns function
    c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2784: 'void *(__cdecl *__cdecl operator new(void))(unsigned int,class std::allocator<`template-parameter257'> &)' : could not deduce template argument for 'void *(__cdecl *)(u
    nsigned int,class std::allocator<_Ty> &)' from 'void *(__cdecl *)(unsigned int)'
    c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2785: 'void *(__cdecl *__cdecl operator new(void))(unsigned int,class std::allocator<`template-parameter257'> &)' and 'void *(__cdecl *__cdecl operator new(void))(unsigned int
    )' have different return types
    c:\program files\microsoft visual studio\vc98\include\memory(16) : see declaration of 'new'
    c:\program files\microsoft visual studio\vc98\include\memory(17) : error C2809: 'operator new' has no formal parameters
    c:\program files\microsoft visual studio\vc98\include\memory(20) : error C2954: template definitions cannot nest
    J'ai mis le bloc de code juste après l'include du stafx.

  7. #7
    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
    Résolu.
    Pour cela j'ai utiliser une bibliothèque vld : Visual Leak Detector que j'ai trouvé ici :
    http://www.codeproject.com/KB/applic...kdetector.aspx
    C'est une librairie à liée avec le projet qui permet de tracer les allocation non désalouées. Elle m'a permis de detecter que dans une méthode de ma classe template j'ai un new sans le delete qui va avec.
    Dans un code normal, VC++ aurait suffit a s'en sortir, mais ici il s'agit de template donc d'un code qui générée à la compilation et qui n'existe donc pas. C'est mon explication.
    Maintenant il faut que je déclare ce fil résolu. Comment ?

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

Discussions similaires

  1. Outils pour detecter les fuite de mémoire
    Par sese12345 dans le forum Windows Mobile
    Réponses: 2
    Dernier message: 31/03/2010, 10h10
  2. comment détecter les fuites mémoires
    Par cyrille37 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 26/04/2008, 15h12
  3. Réponses: 5
    Dernier message: 07/04/2008, 16h36
  4. [AJAX] Que faire contre les fuites mémoires (memory leaks)
    Par cassy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/08/2007, 16h50
  5. Traquer les fuites mémoires (memoryLeak) ?
    Par MonsieurAk dans le forum Windows
    Réponses: 2
    Dernier message: 08/09/2005, 09h07

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