Sdílet prostřednictvím


_heapwalk

Prochází haldu a vrací informace o další položce.

Důležité

Toto rozhraní API nelze použít v aplikacích, které se spouští v prostředí Windows Runtime s výjimkou sestavení ladění. Další informace najdete v tématu Funkce CRT, které nejsou v aplikacích Univerzální platforma Windows podporované.

Syntaxe

int _heapwalk( _HEAPINFO *entryinfo );

Parametry

entryinfo
Vyrovnávací paměť obsahující informace haldy.

Vrácená hodnota

_heapwalk vrátí jednu z následujících celočíselné konstanty manifestu definované v Malloc.h.

Vrácená hodnota Význam
_HEAPBADBEGIN Informace o počáteční hlavičce jsou neplatné nebo nebyly nalezeny.
_HEAPBADNODE Byla nalezena poškozená halda nebo chybný uzel.
_HEAPBADPTR Pole _pentry _HEAPINFO struktury neobsahuje platný ukazatel na haldu nebo entryinfo je ukazatel null.
_HEAPEND Konec haldy byl úspěšně dosažen.
_HEAPEMPTY Halda není inicializována.
_HEAPOK Zatím žádné chyby; entryinfo aktualizuje se informacemi o další položce haldy.

Kromě toho, pokud dojde k chybě, _heapwalk nastaví errno na ENOSYS.

Poznámky

Funkce _heapwalk pomáhá ladit problémy související s haldou v programech. Funkce prochází haldou, prochází jednu položku na volání a vrací ukazatel na strukturu typu _HEAPINFO , která obsahuje informace o další položce haldy. Typ _HEAPINFO definovaný v Malloc.h obsahuje následující prvky.

Pole Význam
int *_pentry Vstupní ukazatel haldy
size_t _size Velikost položky haldy
int _useflag Příznak označující, jestli se položka haldy používá.

Volání _heapwalk , které vrátí _HEAPOK , uloží velikost položky v _size poli a nastaví _useflag pole na jednu _FREEENTRY nebo _USEDENTRY (obě jsou konstanty definované v Malloc.h). Chcete-li získat tyto informace o první položce v haldě, předejte _heapwalk ukazatel na _HEAPINFO strukturu, jejíž _pentry člen je NULL. Pokud operační systém nepodporuje _heapwalk, funkce se vrátí _HEAPEND a nastaví errno na ENOSYShodnotu .

Tato funkce ověří jeho parametr. Pokud entryinfo je ukazatel null, je vyvolána neplatná obslužná rutina parametru, jak je popsáno v ověření parametru. Pokud je povoleno pokračovat provádění, errno je nastavena na EINVAL a funkce vrátí _HEAPBADPTR.

Požadavky

Rutina Požadovaný hlavičkový soubor Volitelné záhlaví
_heapwalk <malloc.h> <errno.h>

Další informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad

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

Viz také

Přidělení paměti
_heapadd
_heapchk
_heapmin
_heapset