Compartir a través de


_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

Vea también

Asignación de memoria
_heapadd
_heapchk
_heapmin
_heapset