_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