Partager via


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 la mémoire case activée points.

Méthodes publiques

Nom Description
CMemoryState ::Checkpoint Obtient un instantané (case activée point) 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 case activée point 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/ / GlobalAllocLocalFreeGlobalFree.

  • 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 newdeletede . 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, Differenceet 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 est propre jusqu’à tous les objets qu’il 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é instantané de la mémoire et le stocke dans cet CMemoryState objet.

void Checkpoint();

Notes

Les CMemoryState fonctions membres Difference et DumpAllObjectsSince utilisent ces données 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 tel que défini par un CMemoryState point de case activée.

newState
Nouvel état de mémoire tel que défini par un CMemoryState point de case activée.

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 delayFreeMemDFsur . Pour plus d’informations, consultez afxMemDF, dans la section « Macros et globals MFC ».

Exemple

Le code suivant doit être placé dans 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.

Voir aussi

Graphique hiérarchique