Fungsi RtlAllocateHeap (ntifs.h)
Rutinitas RtlAllocateHeap mengalokasikan blok memori dari tumpukan.
Sintaks
NTSYSAPI PVOID RtlAllocateHeap(
[in] PVOID HeapHandle,
[in, optional] ULONG Flags,
[in] SIZE_T Size
);
Parameter
[in] HeapHandle
Tangani untuk timbunan privat tempat memori akan dialokasikan. Parameter ini adalah handel yang dikembalikan dari panggilan yang berhasil ke RtlCreateHeap .
[in, optional] Flags
Aspek alokasi timbunan yang dapat dikontrol. Menentukan salah satu nilai ini akan menggantikan nilai terkait yang ditentukan ketika tumpukan dibuat dengan RtlCreateHeap. Parameter ini bisa menjadi satu atau beberapa nilai berikut.
Bendera | Makna |
---|---|
HEAP_GENERATE_EXCEPTIONS | Sistem akan menaikkan pengecualian untuk menunjukkan kegagalan fungsi, seperti kondisi di luar memori, alih-alih mengembalikan NULL. |
HEAP_NO_SERIALIZE | Pengecualian bersama tidak akan digunakan saat RtlAllocateHeap mengakses tumpukan. |
HEAP_ZERO_MEMORY | Memori yang dialokasikan akan diinisialisasi ke nol. Jika tidak, memori tidak diinisialisasi ke nol. |
[in] Size
Jumlah byte yang akan dialokasikan. Jika tumpukan, yang ditentukan oleh parameter HeapHandle , adalah tumpukan yang tidak dapat ditumbuhi, Ukuran harus kurang dari atau sama dengan ambang memori virtual tumpukan. (Untuk informasi selengkapnya, lihat anggota VirtualMemoryThreshold dari parameter Parameter ke RtlCreateHeap.)
Mengembalikan nilai
Jika panggilan ke RtlAllocateHeap berhasil, nilai yang dikembalikan adalah penunjuk ke blok yang baru dialokasikan. Nilai yang dikembalikan adalah NULL jika alokasi gagal.
Keterangan
RtlAllocateHeap mengalokasikan blok memori dengan ukuran yang ditentukan dari tumpukan yang ditentukan.
Untuk membebaskan blok memori yang dialokasikan oleh RtlAllocateHeap, panggil RtlFreeHeap.
Memori yang dialokasikan oleh RtlAllocateHeap tidak dapat dipindahkan. Karena memori tidak dapat dipungut, ada kemungkinan tumpukan menjadi terfragmentasi.
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.
Catatan
Untuk melindungi dari pelanggaran akses, gunakan penanganan pengecualian terstruktur untuk melindungi kode apa pun yang menulis ke atau membaca dari tumpukan. Untuk informasi selengkapnya tentang penanganan pengecualian terstruktur dengan akses memori, lihat Menangani Pengecualian.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows XP |
Target Platform | Universal |
Header | ntifs.h (termasuk Ntifs.h) |
Pustaka | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |