_heapwalk

Durchläuft den Heap und gibt Informationen zum folgenden Eintrag zurück.

Wichtig

Diese API kann nicht in Anwendungen verwendet werden, die in Windows-Runtime ausgeführt werden. Dies gilt nicht für Debug-Builds. Weitere Informationen finden Sie im Artikel CRT functions not supported in Universal Windows Platform apps (In Apps für die universelle Windows-Plattform nicht unterstützte CRT-Funktionen).

Syntax

int _heapwalk( _HEAPINFO *entryinfo );

Parameter

entryinfo
Der Puffer, der die Heapinformationen enthält.

Rückgabewert

_heapwalk gibt eine der folgenden ganzzahligen Manifestkonstanten zurück, die in Malloc.h definiert sind.

Rückgabewert Bedeutung
_HEAPBADBEGIN Ursprüngliche Headerinformationen ungültig oder nicht gefunden.
_HEAPBADNODE Heap beschädigt oder ungültiger Knoten gefunden.
_HEAPBADPTR Das _pentry Feld der _HEAPINFO Struktur enthält keinen gültigen Zeiger in den Heap oder entryinfo ist ein Nullzeiger.
_HEAPEND Ende des Heaps erfolgreich erreicht.
_HEAPEMPTY Heap wurde nicht initialisiert.
_HEAPOK Keine Fehler bisher; entryinfo wird mit Informationen zum nächsten Heapeintrag aktualisiert.

Wenn ein Fehler auftritt, setzt _heapwalkerrno zudem auf ENOSYS.

Hinweise

Die _heapwalk-Funktion hilft beim Debuggen heapbezogener Probleme in Programmen. Die Funktion durchläuft den Heap, durchsucht einen Eintrag pro Aufruf und gibt einen Zeiger auf eine Struktur vom Typ _HEAPINFO zurück, die Informationen zum folgenden Heapeintrag enthält. Der in Malloc.h definierte _HEAPINFO-Typ enthält die folgenden Elemente.

Feld Bedeutung
int *_pentry Heapeintragszeiger.
size_t _size Größe des Heapeintrags.
int _useflag Kennzeichnung, die angibt, ob der Heapeintrag verwendet wird.

Ein Aufruf von _heapwalk, der _HEAPOK zurückgibt, speichert die Größe des Eintrags im _size-Feld und setzt das _useflag-Feld auf _FREEENTRY oder _USEDENTRY (beide Konstanten sind in Malloc.h definiert). Zum Abrufen der Informationen über den ersten Eintrag im Heap übergeben Sie einen _heapwalk-Zeiger auf eine _HEAPINFO-Struktur, dessen _pentry-Member NULL ist. Wenn das Betriebssystem nicht unterstützt _heapwalkwird, gibt die Funktion zurück _HEAPEND und legt sie errno auf ENOSYS.

Diese Funktion überprüft seine Parameter. Wenn entryinfo ein NULL-Zeiger ist, wird der Handler für ungültige Parameter aufgerufen, wie in Parameter Validation (Parameterüberprüfung) beschrieben. Wenn die weitere Ausführung zugelassen wird, wird errno auf EINVAL festgelegt, und die Funktion gibt _HEAPBADPTRbeschrieben.

Anforderungen

Routine Erforderlicher Header Optionaler Header
_heapwalk <malloc.h> <errno.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

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

Siehe auch

Speicherzuweisung
_heapadd
_heapchk
_heapmin
_heapset