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.