Partager via


Activation de la détection des fuites de mémoire

Mise à jour : novembre 2007

Cette rubrique s'applique à :

Édition

Visual Basic

C#

C++

Web Developer

Express

La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

Standard

La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

Pro et Team

La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

Légende du tableau :

La rubrique s'applique

Applicable

La rubrique ne s'applique pas

Non applicable

La rubrique s'applique mais la commande est masquée par défaut

Commande ou commandes masquées par défaut.

Les principaux outils de détection des fuites de mémoire sont le débogueur et les fonctions du tas de débogage des bibliothèques Runtime C (CRT). Pour activer les fonctions du tas de débogage, incluez les instructions suivantes dans votre programme :

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
Remarque :

Les instructions #include doivent apparaître dans l'ordre indiqué ici. Si vous modifiez cet ordre, les fonctions que vous utilisez risquent de ne pas fonctionner.

Avec l'inclusion de crtdbg.h, vous mappez les fonctions malloc et free à leurs versions Debug, _malloc_dbg et _free_dbg, qui assurent le suivi de l'allocation et de la désallocation de la mémoire. Ce mappage n'a lieu que dans une version Debug (où _DEBUG est défini). Les versions Release utilisent les fonctions malloc et free ordinaires.

L'instruction #define mappe les versions de base des fonctions du tas CRT aux versions Debug correspondantes. Vous n'avez pas absolument besoin de cette instruction, mais en son absence, le dump des fuites de mémoire contiendra moins d'informations utiles.

Après avoir ajouté les instructions mentionnées plus haut, vous pouvez faire un dump des informations des fuites de mémoire en incluant l'instruction suivante dans votre programme :

_CrtDumpMemoryLeaks();

Lorsque vous exécutez votre programme sous le débogueur, _CrtDumpMemoryLeaks affiche les informations des fuites de mémoire dans la fenêtre Sortie. Ces informations ont l'aspect suivant :

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Si vous n'utilisez pas l'instruction #define _CRTDBG_MAPALLOC, le dump de fuite de mémoire se présente de la manière suivante :

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

Si _CRTDBG_MAP_ALLOC n'est pas défini, l'affichage indique :

  • le numéro d'allocation de mémoire (entre accolades) ;

  • le type de bloc (normal, client ou CRT) ;

  • l'emplacement de la mémoire dans un format hexadécimal ;

  • la taille des données en octets ;

  • le contenu des 16 premiers octets (également au format hexadécimal).

Lorsque _CRTDBG_MAP_ALLOC est défini, l'affichage indique également le fichier dans lequel la mémoire perdue a été allouée. Le nombre entre parenthèses mentionné après le nom de fichier (20, dans cet exemple) désigne le numéro de la ligne à l'intérieur du fichier.

Pour accéder à la ligne du fichier source où la mémoire est allouée

  • Double-cliquez dans la fenêtre Sortie sur la ligne qui contient le nom de fichier et le numéro de ligne.

    - ou -

    Sélectionnez dans la fenêtre Sortie la ligne qui contient le nom de fichier et le numéro de ligne, puis appuyez sur F4.

_CrtSetDbgFlag

L'appel de _CrtDumpMemoryLeaks est assez simple si votre programme s'arrête toujours au même emplacement. Si votre programme peut s'arrêter à plusieurs emplacements, au lieu de placer un appel à _CrtDumpMemoryLeaks à chaque emplacement où le programme peut s'arrêter, vous pouvez inclure l'appel suivant au début du programme :

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

Cette instruction appelle automatiquement _CrtDumpMemoryLeaks lorsque votre programme s'arrête. Vous devez définir les deux champs de bits, _CRTDBG_ALLOC_MEM_DF et _CRTDBG_LEAK_CHECK_DF, comme indiqué ci-dessus.

Définition du mode Rapport CRT

Par défaut, _CrtDumpMemoryLeaks fait un dump des informations des fuites de mémoire dans le volet Débogage de la fenêtre Sortie, comme décrit plus haut. Libre à vous de modifier cette configuration afin de faire un dump des informations à un autre emplacement avec _CrtSetReportMode. Si vous utilisez une bibliothèque, celle-ci peut redéfinir la sortie sur un autre emplacement. Dans ce cas, vous pouvez redéfinir l'emplacement de la sortie dans la fenêtre Sortie en utilisant l'instruction suivante :

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

Pour plus d'informations, consultez _CrtSetReportMode.

Voir aussi

Concepts

Détection et isolement des fuites de mémoire