_heapwalk

Attraversa l'heap e restituisce informazioni relative alla voce successiva.

Importante

Non è possibile usare questa API nelle applicazioni eseguite in Windows Runtime, con l'eccezione delle build di debug. Per altre informazioni, vedere Funzioni CRT non supportate nelle app della piattaforma UWP (Universal Windows Platform).

Sintassi

int _heapwalk( _HEAPINFO *entryinfo );

Parametri

entryinfo
Buffer che deve contenere le informazioni sull'heap.

Valore restituito

_heapwalk restituisce una delle costanti manifeste di tipo Integer seguenti definite in Malloc.h.

Valore restituito Significato
_HEAPBADBEGIN Le informazioni di intestazione iniziali non sono valide o non sono state trovate.
_HEAPBADNODE L'heap è danneggiato o è stato travato un nodo non valido.
_HEAPBADPTR Il _pentry campo della _HEAPINFO struttura non contiene un puntatore valido nell'heap o entryinfo è un puntatore Null.
_HEAPEND Fine dell'heap raggiunta correttamente.
_HEAPEMPTY L'heap non è stato inizializzato.
_HEAPOK Nessun errore finora. entryinfo viene aggiornato con informazioni relative alla voce dell'heap successiva.

Inoltre, se si verifica un errore, _heapwalk imposta errno su ENOSYS.

Osservazioni:

La funzione _heapwalk è utile per eseguire il debug dei problemi relativi all'heap nei programmi. La funzione esamina l'heap, attraversando una voce per ogni chiamata, quindi restituisce un puntatore a una struttura di tipo _HEAPINFO che contiene informazioni sulla voce dell'heap successiva. Il tipo _HEAPINFO, definito in Malloc.h, contiene gli elementi seguenti.

Campo Significato
int *_pentry Puntatore alla voce dell'heap.
size_t _size Dimensioni della voce dell'heap.
int _useflag Flag che indica se la voce dell'heap è in uso.

Una chiamata a _heapwalk che restituisce _HEAPOK consente di archiviare la dimensione della voce nel campo _size e imposta il campo _useflag su _FREEENTRY o _USEDENTRY (entrambe sono costanti definite in malloc. h). Per ottenere queste informazioni sulla prima voce nell'heap, passare a _heapwalk un puntatore a una struttura _HEAPINFO il cui membro _pentry è NULL. Se il sistema operativo non supporta _heapwalk, la funzione restituisce _HEAPEND e imposta errno su ENOSYS.

Questa funzione convalida il relativo parametro. Se entryinfo è un puntatore Null, viene richiamato il gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, errno viene impostato su EINVAL e la funzione restituisce _HEAPBADPTR.

Requisiti

Ciclo Intestazione obbligatoria Intestazione facoltativa
_heapwalk <malloc.h> <errno.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

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

Vedi anche

Allocazione di memoria
_heapadd
_heapchk
_heapmin
_heapset