Fonction GlobalAlloc (winbase.h)
Alloue le nombre spécifié d’octets du tas.
Syntaxe
DECLSPEC_ALLOCATOR HGLOBAL GlobalAlloc(
[in] UINT uFlags,
[in] SIZE_T dwBytes
);
Paramètres
[in] uFlags
Attributs d’allocation de mémoire. Si zéro est spécifié, la valeur par défaut est GMEM_FIXED. Ce paramètre peut être une ou plusieurs des valeurs suivantes, à l’exception des combinaisons incompatibles qui sont spécifiquement notées.
Valeur | Signification |
---|---|
|
Combine GMEM_MOVEABLE et GMEM_ZEROINIT. |
|
Alloue de la mémoire fixe. La valeur de retour est un pointeur. |
|
Alloue de la mémoire mobile. Les blocs de mémoire ne sont jamais déplacés dans la mémoire physique, mais ils peuvent être déplacés dans le tas par défaut.
La valeur de retour est un handle de l’objet mémoire. Pour traduire le handle en pointeur, utilisez la fonction GlobalLock . Cette valeur ne peut pas être combinée avec GMEM_FIXED. |
|
Initialise le contenu de la mémoire à zéro. |
|
Combine GMEM_FIXED et GMEM_ZEROINIT. |
Les valeurs suivantes sont obsolètes, mais sont fournies à des fins de compatibilité avec Windows 16 bits. Ils sont ignorés.
- GMEM_DDESHARE
- GMEM_DISCARDABLE
- GMEM_LOWER
- GMEM_NOCOMPACT
- GMEM_NODISCARD
- GMEM_NOT_BANKED
- GMEM_NOTIFY
- GMEM_SHARE
[in] dwBytes
Nombre d'octets à allouer. Si ce paramètre est égal à zéro et que le paramètre uFlags spécifie GMEM_MOVEABLE, la fonction retourne un handle à un objet de mémoire marqué comme ignoré.
Valeur retournée
Si la fonction réussit, la valeur de retour est un handle de l’objet mémoire nouvellement alloué.
Si la fonction échoue, la valeur de retour est NULL. Pour obtenir des informations détaillées sur l’erreur, appelez GetLastError.
Remarques
La gestion de la mémoire Windows ne fournit pas de tas local et de tas global distincts. Par conséquent, les fonctions GlobalAlloc et LocalAlloc sont essentiellement identiques.
Les indicateurs de mémoire mobile GHND et GMEM_MOVABLE ajoutent une surcharge inutile et nécessitent un verrouillage pour être utilisé en toute sécurité. Elles doivent être évitées, sauf si la documentation indique expressément qu’elles doivent être utilisées.
Les nouvelles applications doivent utiliser les fonctions de tas pour allouer et gérer la mémoire, sauf si la documentation indique spécifiquement qu’une fonction globale doit être utilisée. Par exemple, les fonctions globales sont toujours utilisées avec Dynamic Data Exchange (DDE), les fonctions du Presse-papiers et les objets de données OLE.
Si la fonction GlobalAlloc réussit, elle alloue au moins la quantité de mémoire demandée. Si le montant réel alloué est supérieur au montant demandé, le processus peut utiliser la totalité du montant. Pour déterminer le nombre réel d’octets alloués, utilisez la fonction GlobalSize .
Si le tas ne contient pas suffisamment d’espace libre pour répondre à la demande, GlobalAlloc retourne NULL. Étant donné que NULL est utilisé pour indiquer une erreur, l’adresse virtuelle zéro n’est jamais allouée. Il est donc facile de détecter l’utilisation d’un pointeur NULL .
La mémoire allouée avec cette fonction est garantie d’être alignée sur une limite de 8 octets. Pour exécuter du code généré dynamiquement, utilisez la fonction VirtualAlloc pour allouer de la mémoire et la fonction VirtualProtect pour accorder PAGE_EXECUTE accès.
Pour libérer la mémoire, utilisez la fonction GlobalFree . Il n’est pas sûr de libérer la mémoire allouée avec GlobalAlloc à l’aide de LocalFree.
Exemples
Le code suivant montre une utilisation simple de GlobalAlloc et 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);
}
Configuration requise
Client minimal pris en charge | Windows XP [applications de bureau | applications UWP] |
Serveur minimal pris en charge | Windows Server 2003 [applications de bureau | applications UWP] |
Plateforme cible | Windows |
En-tête | winbase.h (inclure Windows.h) |
Bibliothèque | Kernel32.lib |
DLL | Kernel32.dll |