_heapwalk

Percorre o heap e retorna informações sobre a próxima entrada.

Importante

Esta API não pode ser usada em aplicativos executados no Windows Runtime, exceto em builds de depuração. Para obter mais informações, confira Funções do CRT sem suporte em aplicativos da Plataforma Universal do Windows.

Sintaxe

int _heapwalk( _HEAPINFO *entryinfo );

Parâmetros

Entryinfo
Buffer que conterá informações do heap.

Valor Retornado

_heapwalk retorna uma das seguintes constantes de manifesto inteiro definidas em Malloc.h.

Valor retornado Significado
_HEAPBADBEGIN As informações do cabeçalho inicial são inválidas ou não foram encontradas.
_HEAPBADNODE Heap danificado ou nó inválido encontrado.
_HEAPBADPTR O _pentry campo da estrutura _HEAPINFO não contém um ponteiro válido para o heap ou entryinfo é um ponteiro nulo.
_HEAPEND Fim do heap alcançado com êxito.
_HEAPEMPTY Heap não inicializado.
_HEAPOK Nenhum erro até o momento; entryinfo é atualizado com informações sobre a próxima entrada de heap.

Além disso, se ocorrer um erro, _heapwalkerrno comoENOSYS.

Comentários

A _heapwalk ajuda a depurar problemas relacionados ao heap em programas. A função percorre o heap, percorrendo uma entrada por chamada e retorna um ponteiro para uma estrutura do tipo _HEAPINFO que contém informações sobre a próxima entrada de heap. O _HEAPINFO , definido em Malloc.h, contém os elementos a seguir.

Campo Significado
int *_pentry Ponto de entrada do heap.
size_t _size Tamanho da entrada do heap.
int _useflag Sinalizador que indica se a entrada do heap está sendo utilizada.

Uma chamada para _heapwalk que retorna _HEAPOK armazena o tamanho da entrada no campo _size e define o campo _useflag como _FREEENTRYou _USEDENTRY (ambas são constantes definidas em Malloc.h). Para obter essas informações sobre a primeira entrada no heap, passe _heapwalk ponteiro para uma estrutura _HEAPINFO cujo membro _pentry é NULL. Se o sistema operacional não dá suporte _heapwalk (por exemplo, Windows 98), a função retorna _HEAPEND e define errno como ENOSYS.

Esta função valida seu parâmetro. Se entryinfo for um ponteiro nulo, o manipulador de parâmetro inválido será invocado, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, errno será definido como EINVAL e a função retornará _HEAPBADPTR.

Requisitos

Rotina Cabeçalho necessário Cabeçalho opcional
_heapwalk <malloc.h> <errno.h>

Para obter mais informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

// 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

Consulte também

Alocação de memória
_heapadd
_heapchk
_heapmin
_heapset