Share via


Comment : définir des points d'arrêt sur un numéro d'allocation 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.

Remarque :

Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Paramètres Visual Studio.

Le nom de fichier et le numéro de ligne figurant dans le rapport sur les fuites de mémoire indiquent à quel endroit la mémoire perdue est allouée, mais cette information ne suffit pas toujours à identifier le problème. Souvent, une allocation est appelée à de nombreuses reprises pendant l'exécution du programme, mais la fuite de mémoire ne se produit qu'à l'occasion de certains appels. Pour identifier le problème, vous devez savoir non seulement où la mémoire perdue est allouée, mais également dans quelles conditions la fuite a lieu. L'élément d'information qui vous permet d'obtenir ces renseignements est le numéro d'allocation de mémoire. Il s'agit de la valeur numérique qui apparaît entre accolades après le nom de fichier et le numéro de ligne, lorsque ces derniers sont affichés. Par exemple, dans le résultat suivant, le numéro d'allocation de mémoire est 18. Cela signifie que la fuite de mémoire concerne le 18e bloc de mémoire alloué dans votre programme.

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.

La bibliothèque CRT compte tous les blocs de mémoire alloués pendant une exécution du programme, y compris la mémoire allouée par la bibliothèque CRT elle-même ou par d'autres bibliothèques, telles que MFC. Par conséquent, un objet avec un numéro d'allocation N sera le Nième objet alloué dans votre programme, mais il ne correspondra pas forcément au Nième objet alloué par votre code. (Ce sera même rarement le cas.)

Vous pouvez vous servir du numéro d'allocation de mémoire pour définir un point d'arrêt à l'emplacement où la mémoire est allouée. Pour ce faire, définissez un point d'arrêt d'emplacement à proximité du début du programme. Lorsque votre programme s'arrête en ce point, vous pouvez définir un tel point d'arrêt d'allocation de mémoire à partir de la boîte de dialogue Espion express ou de la fenêtre Espion.

Procédure

Pour définir un point d'arrêt d'allocation de mémoire dans la fenêtre Espion

  1. À l'intérieur de la fenêtre Espion, tapez l'expression suivante dans la colonne Nom :

    _crtBreakAlloc
    

    Si vous utilisez la version DLL multithread de la bibliothèque CRT (l'option /MD), incluez l'opérateur de contexte, comme indiqué ci-après :

    {,,msvcr71d.dll}_crtBreakAlloc
    
  2. Appuyez sur RETOUR.

    Le débogueur évalue l'expression et place le résultat dans la colonne Valeur. Cette valeur sera égale à –1 si vous n'avez défini aucun point d'arrêt sur les allocations de mémoire.

  3. Remplacez la valeur dans la colonne Valeur par le numéro d'allocation de l'allocation de mémoire où vous souhaitez effectuer l'arrêt. Choisissez, par exemple, 18 pour effectuer l'arrêt à l'allocation indiquée dans la sortie ci-dessus.

Après avoir défini des points d'arrêt sur les allocations de mémoire qui vous intéressent, vous pouvez poursuivre le débogage. Veillez à exécuter le programme dans les mêmes conditions que lors de la précédente exécution pour conserver le même ordre d'allocation. Lorsque votre programme s'arrête à l'allocation de mémoire spécifiée, vous pouvez examiner la fenêtre Pile des appels et les autres informations de débogage pour déterminer dans quelles conditions la mémoire a été allouée. Si nécessaire, vous pouvez poursuivre l'exécution du programme à partir de ce point pour savoir ce que devient l'objet et, éventuellement, déterminer pourquoi sa désallocation n'est pas correcte.

Remarque :

La définition d'un point d'arrêt sur variable sur l'objet peut s'avérer utile. Pour plus d'informations, consultez Comment : définir un point d'arrêt de données (natif uniquement).

Bien qu'il soit habituellement plus facile de définir des points d'arrêt d'allocation de mémoire dans le débogueur, vous pouvez, si vous préférez, les définir dans votre code.

Pour définir un point d'arrêt d'allocation de mémoire dans votre code

  • Ajoutez une ligne, telle que la suivante (pour la 18e allocation de mémoire) :

    _crtBreakAlloc = 18;
    

Vous pouvez également utiliser la fonction _CrtSetBreakAlloc, qui a le même effet :

_CrtSetBreakAlloc(18);

Voir aussi

Tâches

Comment : utiliser la fenêtre Pile des appels

Concepts

Détection et isolement des fuites de mémoire

Autres ressources

Fenêtres de variables