Compartir a través de


Función GlobalAlloc (winbase.h)

Asigna el número especificado de bytes del montón.

Nota Las funciones globales tienen mayor sobrecarga y proporcionan menos características que otras funciones de administración de memoria. Las nuevas aplicaciones deben usar las funciones del montón a menos que la documentación indique que se debe usar una función global. Para obtener más información, vea Funciones globales y locales.
 

Sintaxis

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

Parámetros

[in] uFlags

Atributos de asignación de memoria. Si se especifica cero, el valor predeterminado es GMEM_FIXED. Este parámetro puede ser uno o varios de los valores siguientes, excepto las combinaciones incompatibles que se indican específicamente.

Valor Significado
GHND
0x0042
Combina GMEM_MOVEABLE y GMEM_ZEROINIT.
GMEM_FIXED
0x0000
Asigna memoria fija. El valor devuelto es un puntero.
GMEM_MOVEABLE
0x0002
Asigna memoria móvil. Los bloques de memoria nunca se mueven en memoria física, pero se pueden mover dentro del montón predeterminado.

El valor devuelto es un identificador para el objeto de memoria. Para traducir el identificador a un puntero, use la función GlobalLock .

Este valor no se puede combinar con GMEM_FIXED.

GMEM_ZEROINIT
0x0040
Inicializa el contenido de la memoria en cero.
GPTR
0x0040
Combina GMEM_FIXED y GMEM_ZEROINIT.
 

Los siguientes valores están obsoletos, pero se proporcionan por compatibilidad con Windows de 16 bits. Se omiten.

GMEM_DDESHARE
GMEM_DISCARDABLE
GMEM_LOWER
GMEM_NOCOMPACT
GMEM_NODISCARD
GMEM_NOT_BANKED
GMEM_NOTIFY
GMEM_SHARE

[in] dwBytes

Número de bytes que se van a asignar. Si este parámetro es cero y el parámetro uFlags especifica GMEM_MOVEABLE, la función devuelve un identificador a un objeto de memoria marcado como descartado.

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es un identificador para el objeto de memoria recién asignado.

Si la función no se realiza correctamente, el valor devuelto es NULL. Para obtener información de error extendida, llame a GetLastError.

Comentarios

La administración de memoria de Windows no proporciona un montón local independiente y un montón global. Por lo tanto, las funciones GlobalAlloc y LocalAlloc son básicamente las mismas.

Las marcas de memoria móvil GHND y GMEM_MOVABLE agregan sobrecarga innecesaria y requieren que el bloqueo se use de forma segura. Deben evitarse a menos que la documentación indique específicamente que deben usarse.

Las nuevas aplicaciones deben usar las funciones del montón para asignar y administrar memoria a menos que la documentación indique específicamente que se debe usar una función global. Por ejemplo, las funciones globales se siguen usando con el Intercambio dinámico de datos (DDE), las funciones del Portapapeles y los objetos de datos OLE.

Si la función GlobalAlloc se realiza correctamente, asigna al menos la cantidad de memoria solicitada. Si la cantidad real asignada es mayor que la cantidad solicitada, el proceso puede usar toda la cantidad. Para determinar el número real de bytes asignados, use la función GlobalSize .

Si el montón no contiene suficiente espacio libre para satisfacer la solicitud, GlobalAlloc devuelve NULL. Dado que NULL se usa para indicar un error, nunca se asigna la dirección virtual cero. Por lo tanto, es fácil detectar el uso de un puntero NULL .

Se garantiza que la memoria asignada con esta función se alinee en un límite de 8 bytes. Para ejecutar código generado dinámicamente, use la función VirtualAlloc para asignar memoria y la función VirtualProtect para conceder acceso PAGE_EXECUTE .

Para liberar la memoria, use la función GlobalFree . No es seguro liberar memoria asignada con GlobalAlloc mediante LocalFree.

Ejemplos

El código siguiente muestra un uso sencillo de GlobalAlloc y 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);
}

Requisitos

   
Cliente mínimo compatible Windows XP [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado winbase.h (incluye Windows.h)
Library Kernel32.lib
Archivo DLL Kernel32.dll

Vea también

Funciones globales y locales

GlobalDiscard

GlobalFree

GlobalLock

GlobalSize

Funciones del montón

Funciones de administración de memoria