Estructura CMemoryState

Proporciona una manera cómoda de detectar fugas de memoria en el programa.

Sintaxis

struct CMemoryState

Miembros

Constructores públicos

Nombre Descripción
CMemoryState::CMemoryState Construye una estructura similar a una clase que controla los puntos de control de memoria.

Métodos públicos

Nombre Descripción
CMemoryState::Checkpoint Obtiene una instantánea (punto de control) del estado de memoria actual.
CMemoryState::Difference Calcula la diferencia entre dos valores de tipo CMemoryState.
CMemoryState::DumpAllObjectsSince Vuelca un resumen de todos los objetos asignados actualmente desde un punto de control anterior.
CMemoryState::DumpStatistics Imprime estadísticas de asignación de memoria para un objeto CMemoryState.

Comentarios

CMemoryState es una estructura y no tiene una clase base.

Una "fuga de memoria" se produce cuando se asigna memoria para un objeto en el montón, pero no se desasigna cuando ya no se necesita. Dichas fugas de memoria pueden provocar errores de memoria insuficiente. Hay varias maneras de asignar y desasignar memoria en el programa:

  • Mediante el uso de la familia de funciones malloc/ free de la biblioteca en tiempo de ejecución.

  • Mediante el uso de las funciones de administración de memoria de la API de Windows, LocalAlloc/ LocalFree y GlobalAlloc/ GlobalFree.

  • Mediante el uso de los operadores new y delete de C++.

Los diagnósticos de CMemoryState solo ayudan a detectar fugas de memoria causadas cuando la memoria asignada que utiliza el operador new no se desasigna mediante delete. Los otros dos grupos de funciones de administración de memoria son para programas que no son de C++ y no se recomienda mezclarlos con new y delete en el mismo programa. Se proporciona una macro adicional, DEBUG_NEW, para reemplazar al operador new cuando se necesita el seguimiento de archivos y números de línea de las asignaciones de memoria. Se usa DEBUG_NEW cada vez que normalmente usaría el operador new.

Al igual que ocurre con otros diagnósticos, los diagnósticos de CMemoryState solo están disponibles en versiones de depuración del programa. Una versión de depuración debe tener definida la constante _DEBUG.

Si sospecha que el programa tiene una fuga de memoria, puede usar las funciones Checkpoint, Difference y DumpStatistics para descubrir la diferencia entre el estado de la memoria (los objetos asignados) en dos puntos distintos de la ejecución del programa. Esta información puede ser útil para determinar si una función está limpiando todos los objetos que asigna.

Si saber simplemente dónde se produce el desequilibrio en la asignación y designación no le proporciona información suficiente, puede usar la función DumpAllObjectsSince para volcar todos los objetos asignados desde la llamada anterior a Checkpoint. Este volcado muestra el orden de la asignación, el archivo de origen y la línea en la que se asignó el objeto (si usa DEBUG_NEW para la asignación), además de la derivación del objeto, su dirección y su tamaño. DumpAllObjectsSince también llama a la función Dump de cada objeto para proporcionar información sobre su estado actual.

Para más información sobre cómo usar CMemoryState y otros diagnósticos, consulte Técnicas de depuración de MFC.

Nota:

Las declaraciones de objetos de tipo CMemoryState y las llamadas a funciones miembro deben estar entre corchetes por #if defined(_DEBUG)/#endif. Esto hace que los diagnósticos de memoria solo se incluyan en las compilaciones de depuración del programa.

Jerarquía de herencia

CMemoryState

Requisitos

Encabezado: afx.h

CMemoryState::Checkpoint

Toma un resumen de instantánea de la memoria y lo almacena en este objeto CMemoryState.

void Checkpoint();

Comentarios

Las funciones miembro CMemoryStateDifference y DumpAllObjectsSince usan estos datos de instantánea.

Ejemplo

Consulte el ejemplo para el constructor CMemoryState.

CMemoryState::CMemoryState

Construye un objeto CMemoryState vacío que la función miembro Checkpoint o Difference debe llenar.

CMemoryState();

Ejemplo

CMemoryState msOld;
msOld.Checkpoint();
CPerson* pper1 = new CPerson();
CPerson* pper2 = new CPerson();
msOld.DumpAllObjectsSince();

CMemoryState::Difference

Compara dos objetos CMemoryState y, luego, almacena la diferencia en este objeto CMemoryState.

BOOL Difference(
    const CMemoryState& oldState,
    const CMemoryState& newState);

Parámetros

oldState
Estado inicial de la memoria definido por un punto de controlCMemoryState.

newState
Estado nuevo de la memoria definido por un punto de control CMemoryState.

Valor devuelto

Distinto de cero si los dos estados de memoria son diferentes; de lo contrario, 0.

Comentarios

Se debe haber llamado a Checkpoint para los parámetros de cada uno de los dos estados de la memoria.

Ejemplo

Consulte el ejemplo para el constructor CMemoryState.

CMemoryState::DumpAllObjectsSince

Llama a la función Dump para todos los objetos de un tipo derivado de la clase CObject que se asignaron (y que todavía están asignados) desde la última llamada a Checkpoint para este objeto CMemoryState.

void DumpAllObjectsSince() const;

Comentarios

Al llamar a DumpAllObjectsSince con un objeto CMemoryState sin inicializar, se volcarán todos los objetos que actualmente están en la memoria.

Ejemplo

Consulte el ejemplo para el constructor CMemoryState.

CMemoryState::DumpStatistics

Imprime un informe conciso de estadísticas de memoria de un objeto CMemoryState que la función miembro Difference llena.

void DumpStatistics() const;

Comentarios

En el informe, que se imprime en el dispositivo afxDump, se muestra lo siguiente:

Un informe de ejemplo proporciona información sobre el número (o la cantidad) de:

  • bloques libres

  • bloques normales

  • bloques de CRT

  • bloques que se omiten

  • bloques cliente

  • memoria máxima que el programa utiliza en cualquier momento (en bytes)

  • memoria total que el programa utiliza actualmente (en bytes)

Los bloques libres son los bloques cuya desasignación se retrasó si afxMemDF estaba establecido en delayFreeMemDF. Para más información, consulte afxMemDF en la sección "Macros y variables globales de MFC".

Ejemplo

El código siguiente se debe colocar en projnameApp.cpp. Defina estas variables globales:

static CMemoryState oldstate, newstate, diffstate;

En la función InitInstance, agregue la línea:

oldstate.Checkpoint();

Agregue un controlador para la función ExitInstance y use el código siguiente:

newstate.Checkpoint();
if (diffstate.Difference(oldstate, newstate))
{
   TRACE(_T("Memory leaked\n"));
   diffstate.DumpStatistics();
}

Ahora puede ejecutar el programa en modo de depuración para ver la salida de la función DumpStatistics.

Consulte también

Gráfico de jerarquías