Comment : prendre des instantanés de la mémoire
Mise à jour : novembre 2007
Cette rubrique s'applique à :
Édition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
![]() |
![]() |
Natif uniquement |
![]() |
Standard |
![]() |
![]() |
Natif uniquement |
![]() |
Pro et Team |
![]() |
![]() |
Natif uniquement |
![]() |
Légende du tableau :
![]() |
Applicable |
![]() |
Non applicable |
![]() |
Commande ou commandes masquées par défaut. |
![]() |
---|
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. |
Cette rubrique explique comment prendre des instantanés de la mémoire pour faciliter la localisation d'une fuite de mémoire.
Pour détecter une fuite de mémoire
Créez un objet CMemoryState Members et appelez la fonction membre CMemoryState::Checkpoint. Le premier instantané de la mémoire est alors créé.
Une fois que le programme a effectué ses opérations d'allocation et de libération de mémoire, créez un autre objet CMemoryState et appelez Checkpoint pour cet objet. Vous obtenez ainsi un deuxième instantané de l'utilisation de la mémoire.
Créez un troisième objet CMemoryState et appelez sa fonction membre CMemoryState::Difference en fournissant les deux précédents objets CMemoryState comme arguments. S'il existe une différence entre les deux états de la mémoire, la fonction Difference retourne une valeur autre que zéro. Cela indique que certains blocs de mémoire n'ont pas été libérés.
L'exemple suivant présente l'aspect du code :
// Declare the variables needed #ifdef _DEBUG CMemoryState oldMemState, newMemState, diffMemState; oldMemState.Checkpoint(); #endif // Do your memory allocations and deallocations. CString s("This is a frame variable"); // The next object is a heap object. CPerson* p = new CPerson( "Smith", "Alan", "581-0215" ); #ifdef _DEBUG newMemState.Checkpoint(); if( diffMemState.Difference( oldMemState, newMemState ) ) { TRACE( "Memory leaked!\n" ); } #endif
Notez que les instructions de vérification de la mémoire sont placées entre des blocs #ifdef _DEBUG / #endif : elles ne sont donc compilées que dans les versions Debug Win32 de votre programme.
Maintenant que vous connaissez l'existence d'une fuite de mémoire, vous pouvez utiliser une autre fonction membre, CMemoryState::DumpStatistics, pour Affichage des statistiques de la mémoire, qui vous aidera à la localiser.