_heapwalk
Parcourt le tas et retourne des informations sur l’entrée suivante.
Important
Cette API ne peut pas être utilisée dans les applications qui s’exécutent dans le Windows Runtime, sauf dans les builds de débogage. Pour plus d’informations, consultez Fonctions CRT non prises en charge dans les applications de la plateforme Windows universelle.
Syntaxe
int _heapwalk( _HEAPINFO *entryinfo );
Paramètres
entryinfo
Mémoire tampon destinée à contenir les informations relatives au tas.
Valeur retournée
_heapwalk
retourne une des constantes manifestes entières suivantes définies dans Malloc.h.
Valeur retournée | Signification |
---|---|
_HEAPBADBEGIN |
Informations d’en-tête initiales non valides ou introuvables. |
_HEAPBADNODE |
Tas endommagé ou nœud incorrect trouvé. |
_HEAPBADPTR |
Le _pentry champ de la _HEAPINFO structure ne contient pas de pointeur valide dans le tas ou entryinfo est un pointeur Null. |
_HEAPEND |
Fin du tas atteinte avec succès. |
_HEAPEMPTY |
Tas non initialisé. |
_HEAPOK |
Aucune erreur jusqu’à présent ; entryinfo est mis à jour avec des informations sur l’entrée suivante du tas. |
En outre, si une erreur se produit, _heapwalk
définit errno
sur ENOSYS
.
Notes
La fonction _heapwalk
permet de déboguer les problèmes liés au tas dans les programmes. La fonction parcourt le tas, à raison d’une entrée par appel, et retourne un pointeur désignant une structure de type _HEAPINFO
qui contient des informations sur l’entrée suivante du tas. Le type _HEAPINFO
, défini dans Malloc.h, contient les éléments suivants.
Champ | Signification |
---|---|
int *_pentry |
Pointeur vers une entrée du tas. |
size_t _size |
Taille de l’entrée du tas. |
int _useflag |
Indicateur qui indique si l’entrée du tas est en cours d’utilisation. |
Un appel à _heapwalk
qui retourne _HEAPOK
stocke la taille de l’entrée dans le champ _size
et définit le champ _useflag
sur _FREEENTRY
ou _USEDENTRY
(les deux sont des constantes définies dans Malloc.h). Pour obtenir ces informations sur la première entrée du tas, passez à _heapwalk
un pointeur désignant une structure _HEAPINFO
dont le membre _pentry
a la valeur NULL
. Si le système d’exploitation ne prend pas en charge _heapwalk
, la fonction retourne _HEAPEND
et définit la ENOSYS
valeur errno
.
Cette fonction valide son paramètre. Si entryinfo
est un pointeur null, le gestionnaire de paramètres non valides est appelé, comme décrit dans Validation de paramètre. Si l’exécution est autorisée à se poursuivre, errno
a la valeur EINVAL
et la fonction retourne _HEAPBADPTR
.
Spécifications
Routine | En-tête requis | En-tête facultatif |
---|---|---|
_heapwalk |
<malloc.h> | <errno.h> |
Pour plus d’informations sur la compatibilité, consultez Compatibility.
Exemple
// 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