Detection des fuites mémoires avec crtdbg.h

Detection des fuites mémoires avec crtdbg.h

_CrtSetBreakAlloc, _CrtDumpMemoryLeaks

Voir version :

Pas de dépendances

Télécharger :

#include <crtdbg.h>
#include <stdlib.h>

int main()
{
    // BLOC 1
    int BreakAlloc=-1   ;
    _CrtSetBreakAlloc(BreakAlloc);
    // FIN BLOC 1

    {
        int* a = malloc(sizeof(int));
        //free(a);
    }

    // BLOC 2
    _CrtDumpMemoryLeaks();
    // FIN BLOC 2
    return 0;
}



Commentaires

Si vous faites marcher ce code, vous le trouverez tres utile.
Il sert a traquer les fuites mémoire.
(marche uniquement en mode debug)

Testé sous Visual C++ 6.0 et Visual 2005 .Net, Viusual 2008 .Net
Il doit tres bien marcher sous les environnements Windows (devC++, Code::blocks entre autres)

Si vous lancez le programme comme ça, il ne se passera pas grand chose.

Mettez un breakpoint sur la ligne :
_CrtSetBreakAlloc(BreakAlloc);

Lancez le programme en debug : il s'arrete sur cette ligne.
Faite le terminer en debug.

Dans la fenetre output du compilateur, il s'affiche une ligne ayant cette allure :

{58} normal block at 0x004316D0, 4 bytes long.
Data: < > CD CD CD CD 

	  En fait, le programme vous dit qu'une allocation de 4 octets n'a pas été libérée, et surtout, il vous dit que son identifiant est 58.
	  (vous pourrez avoir n'importe quel identifiant)
	  Notez cet identifiant quelque part.

	  Puis relancez le programme SANS RECOMPILER.

	  Il s'arrete sur la ligne :
	  _CrtSetBreakAlloc(BreakAlloc);

grace a votre breakpoint.
Maintenant, éditez la variable BreakAlloc, puis remplacez par le nombre noté (pour moi 58)
puis lancez a nouveau le programme.

Le programme va s'arreter sur le 
int* a = malloc(sizeof(int));

Voila ! Vous avez trouvé ou a été alloué la variable non libérée.

Si vous aviez activé le free, alors il n'y aurait pas eu ce message.

Conclusion :

Un tuto pas tres poussé, je vous l'accorde.
Dans vos programmes, si vous voulez tester les fuites mémoire, mettez le BLOC1 au début de votre main, et BLOC2 a la fin de votre main.
et incluez crtdbg.h
Si le programme comporte des rand(), désactivez le srand(time(NULL)), le temps du test, pour etre dans le MEME contexte lors des 2 lancements.
En effet, si vous n'etes pas dans le meme contexte, les identifiants n'auront rien a voir...

L'essentiel est que le programme soit executé exactement de la meme maniere les deux fois.

Vous localisez ainsi TOUTES VOS FUITES MEMOIRE



Note : si vous utilisez Visual C++ 2005, vérifiez bien d'etre en configuration MDd (multithreaded Dll DEBUG)
	   et non en MD (multithreaded Dll pas debug). Ou alors en MTd et non en MT.