Fungsi GlobalAlloc (winbase.h)
Mengalokasikan jumlah byte yang ditentukan dari tumpukan.
Sintaks
DECLSPEC_ALLOCATOR HGLOBAL GlobalAlloc(
[in] UINT uFlags,
[in] SIZE_T dwBytes
);
Parameter
[in] uFlags
Atribut alokasi memori. Jika nol ditentukan, defaultnya adalah GMEM_FIXED. Parameter ini bisa menjadi satu atau beberapa nilai berikut, kecuali untuk kombinasi yang tidak kompatibel yang secara khusus dicatat.
Nilai | Makna |
---|---|
|
Menggabungkan GMEM_MOVEABLE dan GMEM_ZEROINIT. |
|
Mengalokasikan memori tetap. Nilai yang dikembalikan adalah penunjuk. |
|
Mengalokasikan memori yang dapat di-movable. Blok memori tidak pernah dipindahkan dalam memori fisik, tetapi dapat dipindahkan dalam tumpukan default.
Nilai yang dikembalikan adalah handel ke objek memori. Untuk menerjemahkan handel ke dalam penunjuk, gunakan fungsi GlobalLock . Nilai ini tidak dapat digabungkan dengan GMEM_FIXED. |
|
Menginisialisasi konten memori ke nol. |
|
Menggabungkan GMEM_FIXED dan GMEM_ZEROINIT. |
Nilai berikut kedaluarsa, tetapi disediakan untuk kompatibilitas dengan Windows 16-bit. Mereka diabaikan.
- GMEM_DDESHARE
- GMEM_DISCARDABLE
- GMEM_LOWER
- GMEM_NOCOMPACT
- GMEM_NODISCARD
- GMEM_NOT_BANKED
- GMEM_NOTIFY
- GMEM_SHARE
[in] dwBytes
Jumlah byte yang akan dialokasikan. Jika parameter ini nol dan parameter uFlags menentukan GMEM_MOVEABLE, fungsi mengembalikan handel ke objek memori yang ditandai sebagai dibuang.
Nilai kembali
Jika fungsi berhasil, nilai yang dikembalikan adalah handel ke objek memori yang baru dialokasikan.
Jika fungsi gagal, nilai yang dikembalikan adalah NULL. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.
Keterangan
Manajemen memori Windows tidak menyediakan timbunan lokal dan timbunan global yang terpisah. Oleh karena itu, fungsi GlobalAlloc dan LocalAlloc pada dasarnya sama.
Bendera memori movable GHND dan GMEM_MOVABLE menambahkan overhead yang tidak perlu dan memerlukan penguncian untuk digunakan dengan aman. Mereka harus dihindari kecuali dokumentasi secara khusus menyatakan bahwa mereka harus digunakan.
Aplikasi baru harus menggunakan fungsi heap untuk mengalokasikan dan mengelola memori kecuali dokumentasi secara khusus menyatakan bahwa fungsi global harus digunakan. Misalnya, fungsi global masih digunakan dengan Dynamic Data Exchange (DDE), fungsi clipboard, dan objek data OLE.
Jika fungsi GlobalAlloc berhasil, fungsi ini mengalokasikan setidaknya jumlah memori yang diminta. Jika jumlah aktual yang dialokasikan lebih besar dari jumlah yang diminta, proses dapat menggunakan seluruh jumlah. Untuk menentukan jumlah byte aktual yang dialokasikan, gunakan fungsi GlobalSize .
Jika tumpukan tidak berisi ruang kosong yang cukup untuk memenuhi permintaan, GlobalAlloc mengembalikan NULL. Karena NULL digunakan untuk menunjukkan kesalahan, alamat virtual nol tidak pernah dialokasikan. Oleh karena itu, mudah untuk mendeteksi penggunaan pointer NULL .
Memori yang dialokasikan dengan fungsi ini dijamin selaras pada batas 8-byte. Untuk menjalankan kode yang dihasilkan secara dinamis, gunakan fungsi VirtualAlloc untuk mengalokasikan memori dan fungsi VirtualProtect untuk memberikan akses PAGE_EXECUTE .
Untuk membebaskan memori, gunakan fungsi GlobalFree . Tidak aman untuk membebaskan memori yang dialokasikan dengan GlobalAlloc menggunakan LocalFree.
Contoh
Kode berikut menunjukkan penggunaan sederhana GlobalAlloc dan GlobalFree.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _cdecl main()
{
PSECURITY_DESCRIPTOR pSD;
pSD = (PSECURITY_DESCRIPTOR) GlobalAlloc(
GMEM_FIXED,
sizeof(PSECURITY_DESCRIPTOR));
// Handle error condition
if( pSD == NULL )
{
_tprintf(TEXT("GlobalAlloc failed (%d)\n"), GetLastError());
return;
}
//see how much memory was allocated
_tprintf(TEXT("GlobalAlloc allocated %d bytes\n"), GlobalSize(pSD));
// Use the memory allocated
// Free the memory when finished with it
GlobalFree(pSD);
}
Persyaratan
Klien minimum yang didukung | Windows XP [aplikasi desktop | Aplikasi UWP] |
Server minimum yang didukung | Windows Server 2003 [aplikasi desktop | Aplikasi UWP] |
Target Platform | Windows |
Header | winbase.h (termasuk Windows.h) |
Pustaka | Kernel32.lib |
DLL | Kernel32.dll |