winbase.h


GlobalAlloc

La función GlobalAlloc reserva el número de bytes de memoria especificados desde el montón. En el entorno lineal del API Win32, no hay diferencias entre el montón local y el global.

Sintaxis

HGLOBAL GlobalAlloc(
    UINT uFlags,  // atributos de memoria
    UINT uBytes   // número de bytes a reservar
   );

Parámetros:

uFlags: especifica el modo de reservar la memoria. Si se especifica cero, el valor por defecto es GMEM_FIXED. Excepto para las combinaciones incompatibles que se comentan específicamente, se puede especificar cualquier combinación de las banderas siguientes. Para indicar si la función debe reservar memoria fija o móvil, especificar uno de las cuatro primeras banderas:

Bandera Significado
GMEM_FIXED Reserva memoria fija. Esta bandera no se puede combinar con GMEM_MOVEABLE o GMEM_DISCARDABLE. El valor de retorno es un puntero al bloque de memoria. Para acceder a la memoria, el proceso tan sólo debe hacer un casting del valor de retorno al puntero adecuado.
GMEM_MOVEABLE Reserva memoria móvil. Esta bandera no se puede combinar con GMEM_FIXED. El valor de retorno es un manipulador al objeto de memoria. Este manipulador es un valor de 32 bit privado para el proceso que lo ha obtenido. Para convertir este manipulador en un puntero se usa la función GlobalLock.
GPTR Combina las banderas GMEM_FIXED y GMEM_ZEROINIT.
GHND Combina las banderas GMEM_MOVEABLE y GMEM_ZEROINIT.
GMEM_DDESHARE Reserva memoria para ser usada por las funciones de intercambio dinámico (DDE) para una conversación DDE. Al contrario que en la versión 3.x de Windows, esta memoria no se comparte globalmente. Sin embargo, esta bandera está disponible por compatibilidad. También puede ser usada por algunas aplicaciones para mejorar el comportamiento de las operaciones DDE y deben, por lo tanto, ser especificada si la memoria va a ser usada por DDE. Sólo deben especificar esta bandera los procesos que hagan uso de DDE o del portapapeles para comunicaciones entre procesos.
GMEM_DISCARDABLE Reserva memoria descartable. Esta bandera no puede combinarse con GMEM_FIXED. Algunas aplicaciones basadas en Win32 pueden ignorar esta opción.
GMEM_LOWER Ignorada. Esta bandera sólo se mantiene por compatibilidad con Windows 3.x.
GMEM_NOCOMPACT No compacta o descarta memoria para satisfacer una petición de memoria.
GMEM_NODISCARD No descarta memoria para satisfacer una petición de memoria.
GMEM_NOT_BANKED Ignorada. Esta bandera sólo se mantiene por compatibilidad con Windows 3.x.
GMEM_NOTIFY Ignorada. Esta bandera sólo se mantiene por compatibilidad con Windows 3.x.
GMEM_SHARE Equivale a la bandera GMEM_DDESHARE.
LMEM_ZEROINIT Inicializa el contenido de la memoria con ceros.

uBytes: especifica el número de bytes a reservar. Si este parámetro es cero y el parámetro uFlags especifica la bandera GMEM_MOVEABLE, la función devuelve un manipulador a un objeto de memoria que está marcado como descartado.

Valor de retorno

Si la función tiene éxito, el valor de retorno es el manipulador del nuevo objeto de memoria creado.

Si la función falla, el valor de retorno es NULL. Para obtener información más detallada sobre el error, llamar a la función GetLastError.

Observaciones

Si el montón no contiene suficiente espacio libre de memoria para satisfacer la petición, GlobalAlloc devuelve NULL.

Ya que el valor NULL se usa para indicar un error, las direcciones virtuales cero nunca se reservan. Es, por lo tanto, fácil detectar el uso de un puntero nulo.

Toda la memoria se crea con acceso de ejecución; no se necesita ninguna función especial para ejecutar código generado dinámicamente.

Se garantiza que la memoria reservada con esta función está alineada en bloques de 8 bytes.

Las funciones GlobalAlloc y LocalAlloc están limitadas a un total de 65.536 manipuladores de memoria GMEM_MOVEABLE y LMEM_MOVEABLE por proceso. Esta limitación no se aplica a memoria GMEM_FIXED o LMEM_FIXED.

Si la función tiene éxito, reserva al menos la cantidad pedida. Si la cantidad reservada es mayor que la pedida, el proceso puede usar la totalidad de la reservada. Para determinar en número de bytes actualmente reservados, usar la función GlobalSize.