Volcados de objetos
Actualización: noviembre 2007
Este tema es aplicable a:
Edición |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
Sólo para código nativo |
|||
Standard |
Sólo para código nativo |
|||
Pro y Team |
Sólo para código nativo |
Leyenda de la tabla:
Se aplica |
|
No procede |
|
Comando o comandos ocultos de forma predeterminada. |
En un programa MFC, se puede utilizar CMemoryState::DumpAllObjectsSince para obtener una descripción de todos los objetos del montón que no se han desasignado. DumpAllObjectsSince vuelca todos los objetos asignados desde el último objeto CMemoryState::Checkpoint. Si no se realizó ninguna llamada a Checkpoint, DumpAllObjectsSince produce un volcado de todos los objetos y elementos que no sean objetos actualmente en memoria.
Nota: |
---|
Para poder utilizar el volcado de objetos MFC, habilite Cómo: Habilitar el diagnóstico de memoria. |
Nota: |
---|
MFC produce automáticamente un volcado de todos los objetos no desasignados (pérdidas) cuando el programa termina, de modo que no es necesario crear código para volcar objetos en ese punto. |
El siguiente código prueba si existe pérdida de memoria comparando dos estados de la memoria y produce un volcado de todos los objetos si se detecta una pérdida.
Ejemplo de código heredado
if( diffMemState.Difference( oldMemState, newMemState ) )
{
TRACE( "Memory leaked!\n" );
diffMemState.DumpAllObjectsSince();
}
El contenido del volcado presenta el siguiente aspecto:
Dumping objects ->
{5} strcore.cpp(80) : non-object block at $00A7521A, 9 bytes long
{4} strcore.cpp(80) : non-object block at $00A751F8, 5 bytes long
{3} strcore.cpp(80) : non-object block at $00A751D6, 6 bytes long
{2} a CPerson at $51A4
Last Name: Smith
First Name: Alan
Phone #: 581-0215
{1} strcore.cpp(80) : non-object block at $00A7516E, 25 bytes long
Programación sólida
Los números entre llaves al principio de la mayoría de las líneas especifican el orden en que se asignaron los objetos. El objeto asignado más recientemente tiene el número más alto y aparece en la parte superior del volcado. Vea Interpretación de un volcado de objetos para obtener un análisis más detallado de este ejemplo.
Para obtener la máxima información posible de un volcado de objetos, se puede invalidar la función miembro Dump de cualquier objeto derivado de CObject para Personalización de un volcado de objetos.
Puede establecer un punto de interrupción en una determinada asignación de memoria si asigna a la variable global _afxBreakAlloc el número mostrado entre llaves. Si vuelve a ejecutar el programa, el depurador interrumpirá la ejecución cuando se produzca la asignación. Entonces, puede examinar la pila de llamadas para ver cómo llegó el programa a ese punto.
La biblioteca en tiempo de ejecución de C dispone de una función similar, _CrtSetBreakAlloc, que se puede utilizar para asignaciones de memoria de C en tiempo de ejecución.