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

C++ Discussion :

Memory leaks et CRT.


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut Memory leaks et CRT.
    Bonjour

    J'essaye de comprendre le fonctionnement du debugage de la CRT:

    J'ai fait un programme 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
    #include <crtdbg.h>
    #include <iostream>
     
    using namespace std;
     
    #ifndef _DEBUG
    #define _DEBUG
    #endif
    #define _CRTDBG_MAP_ALLOC
     
    int main(){
    	 	 _CrtMemState *state=new _CrtMemState();
     
    	bool sd=_CrtDumpMemoryLeaks();
     
    delete state;
    }
    Quand je le lance, j'ai une sortie du style:


    Detected memory leaks!
    Dumping objects ->
    {53} normal block at 0x00A31760, 52 bytes long.
    Data: < > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    Object dump complete.

    En revanche, quand je fait ce programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(){
     
    	bool sd=_CrtDumpMemoryLeaks();
    	 }
    La tout est ok.

    Or, pour moi, dans mon premier programme il n'y a pas de mémory leaks.
    Car la zone mémoire allouée par new est bien pointée par state. Je ne vois pas ce qu'il veut dire par memory leaks detected. Si j'avais fait ca:


    là oui,il y aurait eu une memory leaks.

    Merci

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 936
    Points
    4 936
    Par défaut
    bonjour,

    dans ton premier extrait de code tu demandes bool sd=_CrtDumpMemoryLeaks(); avant de libérer state, donc forcément il détecte une fuite.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Pour etre plus précis, c'est le coup du serpent qui se mord la queue :

    Tu crées dynamiquement un objet destiné à traquer les fuites mémoires.

    Or comme la création "statique" (comprends : ne faisant pas appel à l'allocation dynamique de la mémoire ) d'objet ne risque pas de provoquer de fuites mémoire, le meilleur moyen de les détecter, c'est de réagir à l'invocation de new ou de new[] pour placer des informations dans une collection ad-hoc et de réagir à l'invocation de delete (ou delete[]) pour les en retirer.

    Comme tu crées ton objet avec new, il est donc le premier objet à être placé dans cette collection, et le système prend en compte l'espace mémoire occupé par celui-ci

    Lorsque tu invoques [codeinline]_CrtDumpMemoryLeaks[/coeinline] avant d'avoir invoqué le delete correspondant, il est donc tout à fait normal que le système t'indique une fuite correspondant... à l'espace mémoire requis pour représenter ton _CrtMemState.

    N'oublie pas, au passage, que les fonctions et les types préfixés de l'underscore " _ " sont, classiquement, des fonctions et des types dépendants de l'implémentation (utilisés par ceux qui fournissent le compilateur)...

    Nous ne rappellerons jamais assez qu'il est dangereux d'utiliser ce genre de fonctions et de types car ils risquent d'empêcher toute compatibilité par la suite
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Compilation TAO / Mfc : Memory Leaks
    Par Rolsct dans le forum CORBA
    Réponses: 4
    Dernier message: 17/04/2005, 19h13
  2. [MFC] Thread & memory leaks
    Par Racailloux dans le forum MFC
    Réponses: 7
    Dernier message: 15/03/2005, 12h44
  3. Memory leak en C/C++
    Par Roswell dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 07/07/2004, 19h41
  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