Tipos de bloques en el montón de depuración
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 manera predeterminada. |
Cada bloque de memoria del montón de depuración se asigna a uno de entre cinco tipos de asignación. Estos tipos reciben un seguimiento y se informa de ellos de forma diferente en cuanto a detección de pérdidas e informe de estados. El tipo de un bloque se puede especificar asignándolo mediante una llamada directa a una de las funciones de asignación del montón de depuración, como _malloc_dbg. Los cinco tipos de bloques de memoria del montón de depuración (definidos en el miembro nBlockUse de la estructura _CrtMemBlockHeader) son los siguientes:
_NORMAL_BLOCK
Una llamada a malloc o calloc crea un bloque Normal. Si se pretende utilizar sólo bloques de tipo Normal y no se necesitan bloques de tipo Cliente, es recomendable definir _CRTDBG_MAP_ALLOC, que hace que todas las llamadas de asignación en el montón se asignen a sus equivalentes de depuración en el caso de versiones de depuración. Esto permite almacenar la información de nombre de archivo y número de línea para cada llamada de asignación en el encabezado de bloque correspondiente._CRT_BLOCK
Los bloques de memoria asignados internamente por muchas de las funciones de la biblioteca en tiempo de ejecución se marcan como bloques CRT, de modo que se puedan controlar por separado. Como resultado de ello, la detección de pérdidas de memoria, así como otras operaciones, no tienen por qué verse afectadas. En una asignación de memoria, nunca se debe asignar, reasignar o liberar ningún bloque de tipo CRT._CLIENT_BLOCK
Una aplicación puede mantener un seguimiento especial de un determinado grupo de asignaciones de memoria, a efectos de depuración, si las asigna como este tipo de bloque de memoria y utiliza llamadas explícitas para las funciones del montón de depuración. MFC, por ejemplo, asigna todos los CObjects como bloques de tipo Cliente; otras aplicaciones podrían mantener diferentes objetos de memoria en bloques Cliente. Asimismo, se pueden especificar subtipos de bloques Cliente para conseguir un mayor detalle en el seguimiento. Si desea especificar subtipos de bloques Cliente, desplace el número 16 bits a la izquierda y súmelo, mediante la operación lógica OR, con _CLIENT_BLOCK. Por ejemplo:#define MYSUBTYPE 4 freedbg(pbData, _CLIENT_BLOCK|(MYSUBTYPE<<16));
Una función de enlace suministrada por el cliente para realizar un volcado de los objetos almacenados en bloques Cliente se puede instalar mediante _CrtSetDumpClient; se llamará a esta función siempre que una función de depuración realice un volcado de un bloque Cliente. Asimismo, _CrtDoForAllClientObjects se puede utilizar para llamar a una función dada suministrada por la aplicación para cada bloque Cliente del montón de depuración.
_FREE_BLOCK
Normalmente, los bloques que se han liberado se quitan de la lista. Para comprobar que aún no se está escribiendo en la memoria liberada, o para simular un estado de escasez de memoria, se puede optar por mantener los bloques liberados en la lista enlazada, marcados como Libres y rellenos con un valor de byte conocido (actualmente 0xDD)._IGNORE_BLOCK
Es posible desactivar las operaciones del montón de depuración durante un período de tiempo. En este período, los bloques de memoria se mantienen en la lista, pero se marcan como bloques Omitir.
Para determinar el tipo y subtipo de un bloque dado, utilice la función _CrtReportBlockType y las macros _BLOCK_TYPE y _BLOCK_SUBTYPE. Las macros se definen (en crtdbg.h) del siguiente modo:
#define _BLOCK_TYPE(block) (block & 0xFFFF)
#define _BLOCK_SUBTYPE(block) (block >> 16 & 0xFFFF)