Partager via


_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 ENOSYSvaleur 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

Voir aussi

Allocation de mémoire
_heapadd
_heapchk
_heapmin
_heapset