GlobalAlloc-Funktion (winbase.h)
Ordnet die angegebene Anzahl von Bytes aus dem Heap zu.
Syntax
DECLSPEC_ALLOCATOR HGLOBAL GlobalAlloc(
[in] UINT uFlags,
[in] SIZE_T dwBytes
);
Parameter
[in] uFlags
Die Speicherzuordnungsattribute. Wenn null angegeben wird, ist der Standardwert GMEM_FIXED. Bei diesem Parameter kann es sich um einen oder mehrere der folgenden Werte handeln, mit Ausnahme der inkompatiblen Kombinationen, die speziell erwähnt werden.
Wert | Bedeutung |
---|---|
|
Kombiniert GMEM_MOVEABLE und GMEM_ZEROINIT. |
|
Ordnet festen Arbeitsspeicher zu. Der Rückgabewert ist ein Zeiger. |
|
Ordnet beweglichen Arbeitsspeicher zu. Speicherblöcke werden nie im physischen Arbeitsspeicher verschoben, können aber innerhalb des Standardheaps verschoben werden.
Der Rückgabewert ist ein Handle für das Speicherobjekt. Verwenden Sie die GlobalLock-Funktion , um den Handle in einen Zeiger zu übersetzen. Dieser Wert kann nicht mit GMEM_FIXED kombiniert werden. |
|
Initialisiert Den Speicherinhalt auf Null. |
|
Kombiniert GMEM_FIXED und GMEM_ZEROINIT. |
Die folgenden Werte sind veraltet, werden aber aus Gründen der Kompatibilität mit 16-Bit-Windows bereitgestellt. Sie werden ignoriert.
- GMEM_DDESHARE
- GMEM_DISCARDABLE
- GMEM_LOWER
- GMEM_NOCOMPACT
- GMEM_NODISCARD
- GMEM_NOT_BANKED
- GMEM_NOTIFY
- GMEM_SHARE
[in] dwBytes
Die Anzahl der zu belegenden Bytes. Wenn dieser Parameter null ist und der uFlags-ParameterGMEM_MOVEABLE angibt, gibt die Funktion ein Handle an ein Speicherobjekt zurück, das als verworfen markiert ist.
Rückgabewert
Wenn die Funktion erfolgreich ist, ist der Rückgabewert ein Handle für das neu zugewiesene Speicherobjekt.
Wenn bei der Funktion ein Fehler auftritt, ist der Rückgabewert NULL. Um erweiterte Fehlerinformationen zu erhalten, rufen Sie GetLastError auf.
Hinweise
Die Windows-Speicherverwaltung bietet keinen separaten lokalen heap und globalen Heap. Daher sind die Funktionen GlobalAlloc und LocalAlloc im Wesentlichen identisch.
Die Movable-Memory-Flags GHND und GMEM_MOVABLE verursachen unnötigen Mehraufwand und erfordern eine sichere Verwendung der Sperrung. Sie sollten vermieden werden, es sei denn, die Dokumentation besagt ausdrücklich, dass sie verwendet werden sollten.
Neue Anwendungen sollten die Heapfunktionen verwenden, um Arbeitsspeicher zuzuweisen und zu verwalten, es sei denn, die Dokumentation weist ausdrücklich darauf hin, dass eine globale Funktion verwendet werden soll. Beispielsweise werden die globalen Funktionen weiterhin mit Dynamic Data Exchange (DDE), den Zwischenablagefunktionen und OLE-Datenobjekten verwendet.
Wenn die GlobalAlloc-Funktion erfolgreich ist, ordnet sie mindestens die angeforderte Arbeitsspeichermenge zu. Wenn der tatsächlich zugewiesene Betrag größer als der angeforderte Betrag ist, kann der Prozess den gesamten Betrag verwenden. Verwenden Sie die GlobalSize-Funktion , um die tatsächliche Anzahl der zugewiesenen Bytes zu ermitteln.
Wenn der Heap nicht genügend freien Speicherplatz zum Erfüllen der Anforderung enthält, gibt GlobalAllocNULL zurück. Da NULL verwendet wird, um einen Fehler anzugeben, wird die virtuelle Adresse 0 nie zugeordnet. Daher ist es einfach, die Verwendung eines NULL-Zeigers zu erkennen.
Der dieser Funktion zugeordnete Arbeitsspeicher wird garantiert an einer 8-Byte-Grenze ausgerichtet. Um dynamisch generierten Code auszuführen, verwenden Sie die VirtualAlloc-Funktion , um Arbeitsspeicher und die VirtualProtect-Funktion zuzuweisen , um PAGE_EXECUTE Zugriff zu gewähren.
Verwenden Sie die GlobalFree-Funktion , um den Arbeitsspeicher freizugeben. Es ist nicht sicher, den mit GlobalAlloc zugewiesenen Arbeitsspeicher mithilfe von LocalFree freizugeben.
Beispiele
Der folgende Code zeigt eine einfache Verwendung von GlobalAlloc und 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);
}
Anforderungen
Unterstützte Mindestversion (Client) | Windows XP [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | winbase.h (einschließlich Windows.h) |
Bibliothek | Kernel32.lib |
DLL | Kernel32.dll |