Condividi tramite


Funzione GlobalAlloc (winbase.h)

Alloca il numero specificato di byte dall'heap.

Nota Le funzioni globali hanno un sovraccarico maggiore e forniscono meno funzionalità rispetto ad altre funzioni di gestione della memoria. Le nuove applicazioni devono usare le funzioni heap , a meno che non venga usata una documentazione che indica che deve essere usata una funzione globale. Per altre informazioni, vedere Funzioni globali e locali.
 

Sintassi

DECLSPEC_ALLOCATOR HGLOBAL GlobalAlloc(
  [in] UINT   uFlags,
  [in] SIZE_T dwBytes
);

Parametri

[in] uFlags

Attributi di allocazione della memoria. Se viene specificato zero, il valore predefinito è GMEM_FIXED. Questo parametro può essere uno o più dei valori seguenti, ad eccezione delle combinazioni incompatibili indicate in modo specifico.

Valore Significato
GHND
0x0042
Combina GMEM_MOVEABLE e GMEM_ZEROINIT.
GMEM_FIXED
0x0000
Alloca la memoria fissa. Il valore restituito è un puntatore.
GMEM_MOVEABLE
0x0002
Alloca memoria rimovibile. I blocchi di memoria non vengono mai spostati nella memoria fisica, ma possono essere spostati all'interno dell'heap predefinito.

Il valore restituito è un handle per l'oggetto memory. Per convertire l'handle in un puntatore, usare la funzione GlobalLock .

Questo valore non può essere combinato con GMEM_FIXED.

GMEM_ZEROINIT
0x0040
Inizializza il contenuto della memoria su zero.
GPTR
0x0040
Combina GMEM_FIXED e GMEM_ZEROINIT.
 

I valori seguenti sono obsoleti, ma sono disponibili per la compatibilità con Windows a 16 bit. Vengono ignorati.

GMEM_DDESHARE
GMEM_DISCARDABLE
GMEM_LOWER
GMEM_NOCOMPACT
GMEM_NODISCARD
GMEM_NOT_BANKED
GMEM_NOTIFY
GMEM_SHARE

[in] dwBytes

Numero di byte da allocare. Se questo parametro è zero e il parametro uFlags specifica GMEM_MOVEABLE, la funzione restituisce un handle a un oggetto memoria contrassegnato come ignorato.

Valore restituito

Se la funzione ha esito positivo, il valore restituito è un handle per l'oggetto memoria appena allocato.

Se la funzione ha esito negativo, il valore restituito è NULL. Per informazioni dettagliate sull'errore, chiamare GetLastError.

Commenti

La gestione della memoria di Windows non fornisce un heap locale separato e un heap globale. Pertanto, le funzioni GlobalAlloc e LocalAlloc sono essenzialmente uguali.

Il flag di memoria mobile contrassegna GHND e GMEM_MOVABLE aggiungere sovraccarico non necessario e richiedere l'uso sicuro del blocco. Devono essere evitati a meno che la documentazione non indichi specificamente che devono essere usate.

Le nuove applicazioni devono usare le funzioni heap per allocare e gestire la memoria, a meno che la documentazione non indichi in modo specifico che deve essere usata una funzione globale. Ad esempio, le funzioni globali vengono ancora usate con Dynamic Data Exchange (DDE), le funzioni degli Appunti e gli oggetti dati OLE.

Se la funzione GlobalAlloc ha esito positivo, alloca almeno la quantità di memoria richiesta. Se l'importo effettivo allocato è maggiore dell'importo richiesto, il processo può usare l'intero importo. Per determinare il numero effettivo di byte allocati, usare la funzione GlobalSize .

Se l'heap non contiene spazio libero sufficiente per soddisfare la richiesta, GlobalAlloc restituisce NULL. Poiché NULL viene usato per indicare un errore, l'indirizzo virtuale zero non viene mai allocato. È quindi facile rilevare l'uso di un puntatore NULL .

La memoria allocata con questa funzione è garantita l'allineamento su un limite di 8 byte. Per eseguire codice generato in modo dinamico, usare la funzione VirtualAlloc per allocare memoria e la funzione VirtualProtect per concedere l'accesso a PAGE_EXECUTE .

Per liberare la memoria, usare la funzione GlobalFree . Non è sicuro liberare memoria allocata con GlobalAlloc usando LocalFree.

Esempio

Il codice seguente mostra un semplice uso di GlobalAlloc e 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);
}

Requisiti

   
Client minimo supportato Windows XP [app desktop | App UWP]
Server minimo supportato Windows Server 2003 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione winbase.h (include Windows.h)
Libreria Kernel32.lib
DLL Kernel32.dll

Vedere anche

Funzioni globali e locali

GlobalDiscard

GlobalFree

GlobalLock

GlobalSize

Funzioni heap

Funzioni di gestione della memoria