_heapwalk
Recorre el montón y devuelve información sobre la entrada siguiente.
Importante
Esta API no se puede usar en aplicaciones que se ejecutan en Windows Runtime, salvo en compilaciones Debug. Para obtener más información, vea Funciones de CRT no admitidas en aplicaciones de la Plataforma universal de Windows.
Sintaxis
int _heapwalk( _HEAPINFO *entryinfo );
Parámetros
entryinfo
Búfer que contendrá la información del montón.
Valor devuelto
_heapwalk
devuelve una de las siguientes constantes de manifiesto enteras, definidas en Malloc.h.
Valor devuelto | Significado |
---|---|
_HEAPBADBEGIN |
La información de encabezado inicial no es válida o no se encuentra. |
_HEAPBADNODE |
Se ha encontrado un montón dañado o un nodo incorrecto. |
_HEAPBADPTR |
El _pentry campo de la _HEAPINFO estructura no contiene un puntero válido en el montón o entryinfo es un puntero nulo. |
_HEAPEND |
Se ha llegado al final del montón correctamente. |
_HEAPEMPTY |
El montón no está inicializado. |
_HEAPOK |
Ningún error hasta el momento. entryinfo se actualiza con la información sobre la siguiente entrada del montón. |
Además, si se produce un error, _heapwalk
establece errno
en ENOSYS
.
Comentarios
La función _heapwalk
ayuda a depurar problemas relacionados con el montón de los programas. La función recorre el montón, atravesando una entrada por llamada, y devuelve un puntero a una estructura del tipo _HEAPINFO
que contiene información sobre la siguiente entrada del montón. El tipo _HEAPINFO
, definido en Malloc.h, contiene los elementos siguientes.
Campo | Significado |
---|---|
int *_pentry |
Puntero de entrada en el montón. |
size_t _size |
Tamaño de la entrada del montón. |
int _useflag |
Marca que indica si la entrada del montón está en uso. |
Una llamada a _heapwalk
que devuelve _HEAPOK
almacena el tamaño de la entrada en el campo _size
y establece el campo _useflag
en _FREEENTRY
o _USEDENTRY
(ambas constantes se definen en Malloc.h). Para obtener esta información sobre la primera entrada del montón, pase un puntero de _heapwalk
a una estructura de _HEAPINFO
cuyo miembro _pentry
sea NULL
. Si el sistema operativo no admite _heapwalk
, la función devuelve _HEAPEND
y establece en errno
ENOSYS
.
Esta función valida su parámetro. Si entryinfo
es un puntero nulo, se invoca el controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, errno
está establecido en EINVAL
y la función devuelve _HEAPBADPTR
.
Requisitos
Routine | Encabezado necesario | Encabezado opcional |
---|---|---|
_heapwalk |
<malloc.h> | <errno.h> |
Para obtener más información sobre compatibilidad, consulte Compatibilidad.
Ejemplo
// crt_heapwalk.c
// This program "walks" the heap, starting
// at the beginning (_pentry = NULL). It prints out each
// heap entry's use, location, and size. It also prints
// out information about the overall state of the heap as
// soon as _heapwalk returns a value other than _HEAPOK
// or if the loop has iterated 100 times.
#include <stdio.h>
#include <malloc.h>
void heapdump(void);
int main(void)
{
char *buffer;
heapdump();
if((buffer = (char *)malloc(59)) != NULL)
{
heapdump();
free(buffer);
}
heapdump();
}
void heapdump(void)
{
_HEAPINFO hinfo;
int heapstatus;
int numLoops;
hinfo._pentry = NULL;
numLoops = 0;
while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK &&
numLoops < 100)
{
printf("%8s block at %Fp of size %4.4X\n",
(hinfo._useflag == _USEDENTRY ? "USED" : "FREE"),
hinfo._pentry, hinfo._size);
numLoops++;
}
switch(heapstatus)
{
case _HEAPEMPTY:
printf("OK - empty heap\n");
break;
case _HEAPEND:
printf("OK - end of heap\n");
break;
case _HEAPBADPTR:
printf("ERROR - bad pointer to heap\n");
break;
case _HEAPBADBEGIN:
printf("ERROR - bad start of heap\n");
break;
case _HEAPBADNODE:
printf("ERROR - bad node in heap\n");
break;
}
}
USED block at 00310650 of size 0100
USED block at 00310758 of size 0800
USED block at 00310F60 of size 0080
FREE block at 00310FF0 of size 0398
USED block at 00311390 of size 000D
USED block at 003113A8 of size 00B4
USED block at 00311468 of size 0034
USED block at 003114A8 of size 0039
...
USED block at 00312228 of size 0010
USED block at 00312240 of size 1000
FREE block at 00313250 of size 1DB0
OK - end of heap