Udostępnij za pośrednictwem


_heapwalk

Przechodzi stertę i zwraca informacje o następnym wpisie.

Ważne

Tego interfejsu API nie można używać w aplikacjach wykonywanych w środowisko wykonawcze systemu Windows z wyjątkiem kompilacji debugowania. Aby uzyskać więcej informacji, zobacz Funkcje CRT nieobsługiwane w aplikacjach platforma uniwersalna systemu Windows.

Składnia

int _heapwalk( _HEAPINFO *entryinfo );

Parametry

entryinfo
Bufor zawierający informacje o stercie.

Wartość zwracana

_heapwalk Zwraca jedną z następujących stałych manifestu liczby całkowitej zdefiniowanych w pliku Malloc.h.

Wartość zwracana Znaczenie
_HEAPBADBEGIN Początkowe informacje nagłówka są nieprawidłowe lub nie znaleziono.
_HEAPBADNODE Sterta uszkodzona lub zły węzeł znaleziono.
_HEAPBADPTR Pole _pentry _HEAPINFO struktury nie zawiera prawidłowego wskaźnika w stercie lub entryinfo jest wskaźnikiem o wartości null.
_HEAPEND Koniec sterta osiągnął pomyślnie.
_HEAPEMPTY Sterta nie została zainicjowana.
_HEAPOK Brak błędów do tej pory; entryinfo program jest aktualizowany o informacje o następnym wpisie sterta.

Ponadto, jeśli wystąpi błąd, _heapwalk ustawia wartość errno ENOSYS.

Uwagi

Funkcja _heapwalk pomaga debugować problemy związane z stertą w programach. Funkcja przechodzi przez stertę, przechodzi przez jeden wpis na wywołanie i zwraca wskaźnik do struktury typu _HEAPINFO zawierającej informacje o następnym wpisie sterta. Typ _HEAPINFO zdefiniowany w pliku Malloc.h zawiera następujące elementy.

Pole Znaczenie
int *_pentry Wskaźnik wejścia sterty.
size_t _size Rozmiar wpisu sterty.
int _useflag Flaga wskazująca, czy wpis sterta jest używany.

Wywołanie metody , które _heapwalk zwraca _HEAPOK , przechowuje rozmiar wpisu w _size polu i ustawia _useflag pole na _FREEENTRY wartość lub _USEDENTRY (oba są stałymi zdefiniowanymi w Malloc.h). Aby uzyskać te informacje o pierwszym wpisie w stercie, przekaż _heapwalk wskaźnik do _HEAPINFO struktury, której _pentry element członkowski to NULL. Jeśli system operacyjny nie obsługuje _heapwalkfunkcji , funkcja zwraca _HEAPEND i ustawia wartość errno .ENOSYS

Ta funkcja weryfikuje jego parametr. Jeśli entryinfo jest wskaźnikiem o wartości null, wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Walidacja parametru. Jeśli wykonywanie jest dozwolone do kontynuowania, jest ustawione na EINVAL , errno a funkcja zwraca wartość _HEAPBADPTR.

Wymagania

Procedura Wymagany nagłówek Opcjonalny nagłówek
_heapwalk <malloc.h> <errno.h>

Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.

Przykład

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

Zobacz też

Alokacja pamięci
_heapadd
_heapchk
_heapmin
_heapset