Fungsi HeapValidate (heapapi.h)

Memvalidasi tumpukan yang ditentukan. Fungsi ini memindai semua blok memori dalam tumpukan dan memverifikasi bahwa struktur kontrol timbunan yang dikelola oleh manajer timbunan berada dalam keadaan konsisten. Anda juga dapat menggunakan fungsi HeapValidate untuk memvalidasi satu blok memori dalam tumpukan tertentu tanpa memeriksa validitas seluruh timbunan.

Sintaks

BOOL HeapValidate(
  [in]           HANDLE  hHeap,
  [in]           DWORD   dwFlags,
  [in, optional] LPCVOID lpMem
);

Parameter

[in] hHeap

Handel ke tumpukan yang akan divalidasi. Handel ini dikembalikan oleh fungsi HeapCreate atau GetProcessHeap .

[in] dwFlags

Opsi akses timbunan. Parameter ini bisa menjadi nilai berikut.

Nilai Makna
HEAP_NO_SERIALIZE
0x00000001
Akses berseri tidak akan digunakan. Untuk informasi selengkapnya, lihat Keterangan.

Untuk memastikan bahwa akses berseri dinonaktifkan untuk semua panggilan ke fungsi ini, tentukan HEAP_NO_SERIALIZE dalam panggilan ke HeapCreate. Dalam hal ini, tidak perlu menentukan HEAP_NO_SERIALIZE tambahan dalam panggilan fungsi ini.

Nilai ini tidak boleh ditentukan saat mengakses tumpukan default proses. Sistem dapat membuat utas tambahan dalam proses aplikasi, seperti handler CTRL+C, yang secara bersamaan mengakses tumpukan default proses.

[in, optional] lpMem

Penunjuk ke blok memori dalam tumpukan yang ditentukan. Parameter ini mungkin NULL.

Jika parameter ini NULL, fungsi mencoba memvalidasi seluruh heap yang ditentukan oleh hHeap.

Jika parameter ini bukan NULL, fungsi mencoba memvalidasi blok memori yang diarahkan oleh lpMem. Ini tidak mencoba memvalidasi sisa timbunan.

Nilai kembali

Jika blok tumpukan atau memori yang ditentukan valid, nilai yang dikembalikan bukan nol.

Jika tumpukan atau blok memori yang ditentukan tidak valid, nilai yang dikembalikan adalah nol. Pada sistem yang disiapkan untuk penelusuran kesalahan, fungsi HeapValidate kemudian menampilkan pesan penelusuran kesalahan yang menjelaskan bagian dari blok tumpukan atau memori yang tidak valid, dan berhenti pada titik henti yang dikodekan secara permanen sehingga Anda dapat memeriksa sistem untuk menentukan sumber invaliditas. Fungsi HeapValidate tidak mengatur nilai kesalahan terakhir utas. Tidak ada informasi kesalahan yang diperluas untuk fungsi ini; jangan panggil GetLastError.

Keterangan

Fungsi HeapValidate terutama berguna untuk penelusuran kesalahan karena validasi berpotensi memakan waktu. Memvalidasi tumpukan dapat memblokir utas lain agar tidak mengakses tumpukan dan dapat menurunkan performa, terutama pada komputer multiproses simetris (SMP). Efek samping ini dapat bertahan hingga HeapValidate kembali.

Ada struktur kontrol timbunan untuk setiap blok memori dalam timbunan, dan untuk tumpuk secara keseluruhan. Saat Anda menggunakan fungsi HeapValidate untuk memvalidasi timbunan lengkap, fungsi ini memeriksa semua struktur kontrol ini untuk konsistensi.

Ketika Anda menggunakan HeapValidate untuk memvalidasi satu blok memori dalam heap, ia hanya memeriksa struktur kontrol yang berkaitan dengan elemen tersebut. HeapValidate hanya dapat memvalidasi blok memori yang dialokasikan. Memanggil HeapValidate pada blok memori yang dibebaskan akan mengembalikan FALSE karena tidak ada struktur kontrol untuk divalidasi.

Jika Anda ingin memvalidasi elemen heap yang dijumlahkan oleh fungsi HeapWalk , Anda hanya boleh memanggil HeapValidate pada elemen yang memiliki PROCESS_HEAP_ENTRY_BUSY di anggota wFlags dari struktur PROCESS_HEAP_ENTRY . HeapValidate mengembalikan FALSE untuk semua elemen heap yang tidak memiliki set bit ini.

Serialisasi memastikan pengecualian bersama ketika dua utas atau lebih mencoba mengalokasikan atau membebaskan blok secara bersamaan dari tumpukan yang sama. Ada biaya performa kecil untuk serialisasi, tetapi harus digunakan setiap kali beberapa utas mengalokasikan dan membebaskan memori dari tumpukan yang sama. Mengatur nilai HEAP_NO_SERIALIZE menghilangkan pengecualian bersama pada tumpukan. Tanpa serialisasi, dua utas atau lebih yang menggunakan handel tumpukan yang sama mungkin mencoba mengalokasikan atau membebaskan memori secara bersamaan, kemungkinan menyebabkan kerusakan dalam tumpukan. Oleh karena itu, nilai HEAP_NO_SERIALIZE dapat digunakan dengan aman hanya dalam situasi berikut:

  • Proses ini hanya memiliki satu utas.
  • Proses ini memiliki beberapa utas, tetapi hanya satu utas yang memanggil fungsi tumpukan untuk tumpukan tertentu.
  • Proses ini memiliki beberapa utas, dan aplikasi menyediakan mekanismenya sendiri untuk pengecualian bersama ke tumpukan tertentu.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows XP [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2003 [hanya aplikasi desktop]
Target Platform Windows
Header heapapi.h (termasuk Windows.h)
Pustaka Kernel32.lib
DLL Kernel32.dll

Lihat juga

Fungsi Heap

HeapCreate

HeapWalk

Fungsi Manajemen Memori

PROCESS_HEAP_ENTRY