Comparaison des états 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. |
Une autre technique pour détecter les fuites de mémoire consiste à prendre des instantanés de l'état de la mémoire de l'application en certains points clés. La bibliothèque CRT fournit un type de structure, _CrtMemState, dont vous pouvez vous servir pour stocker un instantané de l'état de la mémoire :
_CrtMemState s1, s2, s3;
Pour prendre un instantané de l'état de la mémoire en un point donné, passez une structure _CrtMemState à la fonction _CrtMemCheckpoint. Cette fonction remplit la structure avec un instantané de l'état actuel de la mémoire :
_CrtMemCheckpoint( &s1 );
Vous pouvez faire un dump du contenu d'une structure _CrtMemState en un point quelconque en passant la structure à la fonction _CrtMemDumpStatistics :
_CrtMemDumpStatistics( &s1 );
Cette fonction imprime un dump des informations d'allocation de mémoire qui a l'aspect suivant :
0 bytes in 0 Free Blocks.
0 bytes in 0 Normal Blocks.
3071 bytes in 16 CRT Blocks.
0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks.
Largest number used: 3071 bytes.
Total allocations: 3764 bytes.
Pour déterminer si une fuite de mémoire a eu lieu dans une section de code, vous pouvez prendre des instantanés de l'état de la mémoire avant et après la section, puis comparer les deux états avec _CrtMemDifference :
_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemCheckpoint( &s2 );
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );
Comme son nom l'indique, _CrtMemDifference compare deux états de mémoire (s1 et s2) et produit un résultat (s3) qui correspond à la différence entre les deux états. En plaçant des appels à _CrtMemCheckpoint au début et à la fin de votre programme, puis en utilisant _CrtMemDifference pour comparer les résultats, vous disposez d'un autre moyen de rechercher les fuites de mémoire. Si une fuite est détectée, vous pouvez utiliser des appels à _CrtMemCheckpoint pour diviser votre programme et localiser la fuite avec une technique de recherche binaire.