Bagikan melalui


_heapwalk

Melintasi tumpukan dan mengembalikan informasi tentang entri berikutnya.

Penting

API ini tidak dapat digunakan dalam aplikasi yang dijalankan di Windows Runtime kecuali dalam build Debug. Untuk informasi selengkapnya, lihat Fungsi CRT yang tidak didukung di aplikasi Platform Windows Universal.

Sintaks

int _heapwalk( _HEAPINFO *entryinfo );

Parameter

entryinfo
Buffer untuk berisi informasi timbunan.

Nilai hasil

_heapwalk mengembalikan salah satu konstanta manifes bilangan bulat berikut yang ditentukan dalam Malloc.h.

Nilai hasil Makna
_HEAPBADBEGIN Informasi header awal tidak valid atau tidak ditemukan.
_HEAPBADNODE Timbunan rusak atau node buruk ditemukan.
_HEAPBADPTR Bidang _pentry_HEAPINFO struktur tidak berisi penunjuk yang valid ke dalam tumpukan atau entryinfo merupakan penunjuk null.
_HEAPEND Akhir timbunan berhasil dicapai.
_HEAPEMPTY Timbunan tidak diinisialisasi.
_HEAPOK Sejauh ini tidak ada kesalahan; entryinfo diperbarui dengan informasi tentang entri timbunan berikutnya.

Selain itu, jika terjadi kesalahan, _heapwalk atur errno ke ENOSYS.

Keterangan

Fungsi ini _heapwalk membantu men-debug masalah terkait timbunan dalam program. Fungsi ini berjalan melalui tumpukan, melintas satu entri per panggilan, dan mengembalikan penunjuk ke struktur jenis _HEAPINFO yang berisi informasi tentang entri tumpukan berikutnya. Jenis, _HEAPINFO yang didefinisikan dalam Malloc.h, berisi elemen berikut.

Bidang Makna
int *_pentry Penunjuk entri timbunan.
size_t _size Ukuran entri tumpukan.
int _useflag Bendera yang menunjukkan apakah entri tumpukan sedang digunakan.

Panggilan ke _heapwalk yang mengembalikan _HEAPOK menyimpan ukuran entri di _size bidang dan mengatur _useflag bidang menjadi atau _FREEENTRY_USEDENTRY (keduanya adalah konstanta yang ditentukan dalam Malloc.h). Untuk mendapatkan informasi ini tentang entri pertama dalam tumpukan, berikan _heapwalk penunjuk ke _HEAPINFO struktur yang anggotanya adalah .NULL_pentry Jika sistem operasi tidak mendukung _heapwalk, fungsi mengembalikan _HEAPEND dan mengatur errno ke ENOSYS.

Fungsi ini memvalidasi parameternya. Jika entryinfo adalah penunjuk null, handler parameter yang tidak valid dipanggil, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, errno diatur ke EINVAL dan fungsi mengembalikan _HEAPBADPTR.

Persyaratan

Rutin Header yang diperlukan Header opsional
_heapwalk <malloc.h> <errno.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Contoh

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

Baca juga

Alokasi memori
_heapadd
_heapchk
_heapmin
_heapset