Bagikan melalui


Fungsi GlobalAlloc (winbase.h)

Mengalokasikan jumlah byte yang ditentukan dari tumpukan.

Catatan Fungsi global memiliki overhead yang lebih besar dan menyediakan lebih sedikit fitur daripada fungsi manajemen memori lainnya. Aplikasi baru harus menggunakan fungsi heap kecuali dokumentasi menyatakan bahwa fungsi global harus digunakan. Untuk informasi selengkapnya, lihat Fungsi Global dan Lokal.
 

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
GHND
0x0042
Menggabungkan GMEM_MOVEABLE dan GMEM_ZEROINIT.
GMEM_FIXED
0x0000
Mengalokasikan memori tetap. Nilai yang dikembalikan adalah penunjuk.
GMEM_MOVEABLE
0x0002
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.

GMEM_ZEROINIT
0x0040
Menginisialisasi konten memori ke nol.
GPTR
0x0040
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

Lihat juga

Fungsi Global dan Lokal

Kartu GlobalDiscard

GlobalFree

GlobalLock

GlobalSize

Fungsi Heap

Fungsi Manajemen Memori