CMemoryState, structure
Fournit un moyen pratique de détecter les fuites de mémoire dans votre programme.
Syntaxe
struct CMemoryState
Membres
Constructeurs publics
Nom | Description |
---|---|
CMemoryState ::CMemoryState | Construit une structure de type classe qui contrôle les points de contrôle de mémoire. |
Méthodes publiques
Nom | Description |
---|---|
CMemoryState ::Checkpoint | Obtient un instantané (point de contrôle) de l’état de mémoire actuel. |
CMemoryState ::D ifference | Calcule la différence entre deux objets de type CMemoryState . |
CMemoryState ::D umpAllObjectsSince | Vide un résumé de tous les objets actuellement alloués depuis un point de contrôle précédent. |
CMemoryState ::D umpStatistics | Imprime les statistiques d’allocation de mémoire pour un CMemoryState objet. |
Notes
CMemoryState
est une structure et n’a pas de classe de base.
Une « fuite de mémoire » se produit lorsque la mémoire d’un objet est allouée sur le tas, mais pas libérée lorsqu’elle n’est plus nécessaire. Ces fuites de mémoire peuvent éventuellement entraîner des erreurs de mémoire insuffisante. Il existe plusieurs façons d’allouer et de libérer de la mémoire dans votre programme :
Utilisation de la
malloc
/free
famille de fonctions de la bibliothèque d’exécution.Utilisation des fonctions de gestion de la mémoire de l’API Windows et
LocalAlloc
/ /GlobalAlloc
LocalFree
GlobalFree
.Utilisation des opérateurs et
delete
C++new
.
Les CMemoryState
diagnostics permettent uniquement de détecter les fuites de mémoire provoquées lorsque la mémoire allouée à l’aide de l’opérateur n’est pas libérée à l’aide new
delete
de . Les deux autres groupes de fonctions de gestion de la mémoire sont destinés aux programmes non C++, et le mélange avec new
et delete
dans le même programme n’est pas recommandé. Une macro supplémentaire, DEBUG_NEW, est fournie pour remplacer l’opérateur new
lorsque vous avez besoin d’un fichier et d’un suivi de numéro de ligne des allocations de mémoire. DEBUG_NEW est utilisé chaque fois que vous utilisez normalement l’opérateur new
.
Comme pour les autres diagnostics, les CMemoryState
diagnostics sont disponibles uniquement dans les versions de débogage de votre programme. Une version de débogage doit avoir la constante _DEBUG définie.
Si vous soupçonnez que votre programme a une fuite de mémoire, vous pouvez utiliser le Checkpoint
, Difference
et DumpStatistics
les fonctions pour découvrir la différence entre l’état de la mémoire (objets alloués) à deux points différents dans l’exécution du programme. Ces informations peuvent être utiles pour déterminer si une fonction nettoie tous les objets qu’elle alloue.
Si vous connaissez simplement où se produit le déséquilibre dans l’allocation et la désallocation ne fournit pas suffisamment d’informations, vous pouvez utiliser la DumpAllObjectsSince
fonction pour vider tous les objets alloués depuis l’appel précédent à Checkpoint
. Ce vidage affiche l’ordre d’allocation, le fichier source et la ligne où l’objet a été alloué (si vous utilisez DEBUG_NEW pour l’allocation) et la dérivation de l’objet, de son adresse et de sa taille. DumpAllObjectsSince
appelle également la fonction de Dump
chaque objet pour fournir des informations sur son état actuel.
Pour plus d’informations sur l’utilisation CMemoryState
et d’autres diagnostics, consultez Débogage d’applications MFC.
Remarque
Les déclarations d’objets de type CMemoryState
et d’appels aux fonctions membres doivent être entre crochets par #if defined(_DEBUG)/#endif
des directives. Cela entraîne l’inclusion des diagnostics de mémoire uniquement dans les builds de débogage de votre programme.
Hiérarchie d'héritage
CMemoryState
Spécifications
En-tête : afx.h
CMemoryState ::Checkpoint
Prend un résumé de la mémoire d’instantané et le stocke dans cet CMemoryState
objet.
void Checkpoint();
Notes
Les CMemoryState
fonctions membres Difference et DumpAllObjectsSince utilisent ces données d’instantané.
Exemple
Consultez l’exemple du constructeur CMemoryState .
CMemoryState ::CMemoryState
Construit un objet vide CMemoryState
qui doit être renseigné par la fonction membre Checkpoint ou Difference .
CMemoryState();
Exemple
CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();
CMemoryState ::D ifference
Compare deux CMemoryState
objets, puis stocke la différence dans cet CMemoryState
objet.
BOOL Difference(
const CMemoryState& oldState,
const CMemoryState& newState);
Paramètres
oldState
État de mémoire initial défini par un CMemoryState
point de contrôle.
newState
Nouvel état de mémoire tel que défini par un CMemoryState
point de contrôle.
Valeur de retour
Différent de zéro si les deux états de mémoire sont différents ; sinon 0.
Notes
Le point de contrôle doit avoir été appelé pour chacun des deux paramètres d’état de mémoire.
Exemple
Consultez l’exemple du constructeur CMemoryState .
CMemoryState ::D umpAllObjectsSince
Appelle la Dump
fonction pour tous les objets d’un type dérivé de classe CObject
qui ont été alloués (et sont toujours alloués) depuis le dernier appel de point de contrôle pour cet CMemoryState
objet.
void DumpAllObjectsSince() const;
Notes
L’appel DumpAllObjectsSince
avec un objet non initialisé CMemoryState
vide tous les objets actuellement en mémoire.
Exemple
Consultez l’exemple du constructeur CMemoryState .
CMemoryState ::D umpStatistics
Imprime un rapport de statistiques de mémoire concis à partir d’un CMemoryState
objet rempli par la fonction membre Difference .
void DumpStatistics() const;
Notes
Le rapport, imprimé sur l’appareil afxDump , affiche les éléments suivants :
Un exemple de rapport fournit des informations sur le nombre (ou la quantité) de :
blocs libres
blocs normaux
Blocs CRT
ignorer les blocs
blocs clients
mémoire maximale utilisée par le programme à tout moment (en octets)
mémoire totale actuellement utilisée par le programme (en octets)
Les blocs libres sont le nombre de blocs dont la désallocation a été retardée si afxMemDF
elle a été définie delayFreeMemDF
sur . Pour plus d’informations, consultez afxMemDF, dans la section « Macros et globals MFC ».
Exemple
Le code suivant doit être placé dans le nom projnameApp.cpp. Définissez les variables globales suivantes :
static CMemoryState oldstate, newstate, diffstate;
Dans la InitInstance
fonction, ajoutez la ligne :
oldstate.Checkpoint();
Ajoutez un gestionnaire pour la ExitInstance
fonction et utilisez le code suivant :
newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
TRACE(_T("Memory leaked\n"));
diffstate.DumpStatistics();
}
Vous pouvez maintenant exécuter le programme en mode Débogage pour afficher la sortie de la DumpStatistics
fonction.