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] memory leaks


Sujet :

MFC

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

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

    j'ai un mémory leak dont ne parviens pas à me débarrasser:
    Detected memory leaks!
    Dumping objects ->
    {16050} client block at 0x013DF5E0, subtype c0, 16 bytes long.
    First-chance exception at 0x7c809eec in TestIndex_d.exe: 0xC0000005: Access violation reading location 0x0135201c.
    an invalid object at $013DF5E0, 16 bytes long
    Je n'arrive pas à le localiser car le #d'allocation (ici 16050) n'est jamais le même d'une exécution à l'autre.
    Le plus énervant, c'est que je pense être parvenu à trouver le bout de code qui génère cette fuite, car si j'enlève ce bout de code, je n'ai plus de fuite. Mais peut-être est-ce "l'arbre qui cache la forêt"? Car ce bout de code est simple:
    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
     
    MaMethode()
    {
    switch:
    [...]
    case 1:
          ObjetA *a;
     
          while ( (a= m_maFIFO.Get()) )
          {
                ObjetB *b= (ObjetB*) a->GetB();
                // ici, un appel de fonction qui utilise les membres de b (uniquement des int => pas de buffer, ni char*, ni pointeur de façon générale):
                f(b->membre1, b->membre2);
     
                SAFE_DELETE(a);
          }
    break;
    [...]
    }
    Si je rajoute SAFE_DELETE(b) avant SAFE_DELETE(a), ça plante.
    Je ne comprends pas trop ce qu'il se passe ici. Peut-être y a-t-il un rapport avec le switch?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Ou un mauvais cast. Utilise dynamic_cast dans ce genre de cas.
    http://c.developpez.com/faq/cpp/?pag...s#DIVERS_casts

    ou alors le destructeur de a n'est pas virtuel
    http://c.developpez.com/faq/cpp/?pag...UCTEUR_virtuel

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Merci pour ton aide

    Citation Envoyé par Aurelien.Regat-Barrel
    Ou un mauvais cast. Utilise dynamic_cast dans ce genre de cas.
    http://c.developpez.com/faq/cpp/?pag...s#DIVERS_casts
    En fait je me suis trompé, toutes mes excuses: B n'est pas une classe mais une struct. Je ne peux donc pas faire de dynamic_cast.


    Citation Envoyé par Aurelien.Regat-Barrel
    ou alors le destructeur de a n'est pas virtuel
    http://c.developpez.com/faq/cpp/?pag...UCTEUR_virtuel
    En effet, le destructeur de A n'est pas virtuel. Mais le problème n'est pas là car A n'est pas dérivée.

  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
    salut,
    donc dans la serie j'ai un leak lol,
    est ce que toutes les libs et programme utilisent la meme crt ?
    pas de melange multi-thread dll et multi-thread static ?

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Et bien si, et tu mets le doigts sur un truc qui me pose pas mal de soucis, et par que pour les memory leaks. Certains projets de ma solution doivent être compilés en multithread debug dll, et d'autres en multithread debug tout court.

    Quant à la crt, je pense qu'ils utisent toute la même, je vérifirais lundi.

    Dans mes cauchemars, l'output de visual est grande comme un écran de cinéma et je vois défiler des memory leaks à l'infini...

  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
    donc c'est pas la meme ,un utilise la crt sous forme de dll soit le couple msvrt(d).lib et MSVCR80.DLL (sous VC2005)
    soit en static :LIBCMT(d).lib .
    ce qui est alloué par une CRT ne peux etre libéré par une autre..
    regarde aussi ce lien:
    see Potential Errors Passing CRT Objects Across DLL Boundaries.

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    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 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    En effet. Ce lien explique pas mal de mes soucis, merci.
    En revanche, ce qui est énervant, c'est que je ne peux rien y faire

    encore

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

Discussions similaires

  1. [VS 2005] Desactiver memory leak dump en DEBUG?
    Par vdaanen dans le forum Visual C++
    Réponses: 3
    Dernier message: 29/08/2011, 17h34
  2. Réponses: 2
    Dernier message: 08/03/2009, 11h09
  3. [debug] memory leak
    Par r0d dans le forum MFC
    Réponses: 8
    Dernier message: 13/01/2006, 10h46
  4. [MFC] A la chasse au memory leak
    Par Yabo dans le forum MFC
    Réponses: 17
    Dernier message: 27/06/2004, 17h35
  5. Réponses: 7
    Dernier message: 26/02/2004, 09h32

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