Bagikan melalui


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

Lihat juga

RtlCreateHeap

RtlDestroyHeap

RtlFreeHeap