Partager via


Fonction GlobalAlloc (winbase.h)

Alloue le nombre spécifié d’octets du tas.

Note Les fonctions globales ont une surcharge plus importante et fournissent moins de fonctionnalités que les autres fonctions de gestion de la mémoire. Les nouvelles applications doivent utiliser les fonctions de tas , sauf si la documentation indique qu’une fonction globale doit être utilisée. Pour plus d’informations, consultez Fonctions globales et locales.
 

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
GHND
0x0042
Combine GMEM_MOVEABLE et GMEM_ZEROINIT.
GMEM_FIXED
0x0000
Alloue de la mémoire fixe. La valeur de retour est un pointeur.
GMEM_MOVEABLE
0x0002
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.

GMEM_ZEROINIT
0x0040
Initialise le contenu de la mémoire à zéro.
GPTR
0x0040
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

Voir aussi

Fonctions globales et locales

GlobalDiscard

GlobalFree

GlobalLock

GlobalSize

Fonctions de tas

Fonctions de gestion de la mémoire