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
yGlobalAlloc
/GlobalFree
.Mediante el uso de los operadores
new
ydelete
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 CMemoryState
Difference 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
.