Funciones globales y locales

Las funciones globales y locales son compatibles con la portabilidad desde código de 16 bits o para mantener la compatibilidad del código fuente con Windows de 16 bits. A partir de Windows de 32 bits, las funciones globales y locales se implementan como funciones contenedoras que llaman a las funciones del montón correspondientes mediante un identificador para el montón predeterminado del proceso. Por lo tanto, las funciones globales y locales tienen una sobrecarga mayor que otras funciones de administración de memoria.

Las funciones del montón proporcionan más características y control que las funciones globales y locales. Las nuevas aplicaciones deben usar las funciones del montón a menos que la documentación indique específicamente que se debe usar una función global o local. Por ejemplo, algunas funciones de Windows asignan memoria que se debe liberar con LocalFree y las funciones globales se siguen usando con El intercambio dinámico de datos (DDE), las funciones del Portapapeles y los objetos de datos OLE. Para obtener una lista completa de las funciones globales y locales, consulte la tabla en Funciones de administración de memoria.

La administración de memoria de Windows no proporciona un montón local independiente y un montón global, ya que Windows de 16 bits sí. Como resultado, las familias globales y locales de funciones son equivalentes y elegir entre ellas es una cuestión de preferencia personal. Tenga en cuenta que el cambio de un modelo de memoria segmentada de 16 bits a un modelo de memoria virtual de 32 bits ha hecho que algunas de las funciones globales y locales relacionadas y sus opciones sean innecesarias o sin sentido. Por ejemplo, ya no hay punteros cercanos y lejanos, ya que las asignaciones locales y globales devuelven direcciones virtuales de 32 bits.

Los objetos de memoria asignados por GlobalAlloc y LocalAlloc están en páginas privadas confirmadas con acceso de lectura y escritura a los que no pueden acceder otros procesos. La memoria asignada mediante GlobalAlloc con GMEM_DDESHARE no se comparte globalmente, ya que está en Windows de 16 bits. Este valor no tiene ningún efecto y solo está disponible para la compatibilidad. Las aplicaciones que requieren memoria compartida para otros fines deben usar objetos de asignación de archivos. Varios procesos pueden asignar una vista del mismo objeto de asignación de archivos para proporcionar memoria compartida con nombre. Para obtener más información, vea Asignación de archivos.

Las asignaciones de memoria solo están limitadas por la memoria física disponible, incluido el almacenamiento en el archivo de paginación en el disco. Al asignar memoria fija, GlobalAlloc y LocalAlloc devuelven un puntero que el proceso de llamada puede usar inmediatamente para acceder a la memoria. Al asignar memoria desplazable, el valor devuelto es un identificador. Para obtener un puntero a un objeto de memoria móvil, use las funciones GlobalLock y LocalLock .

El tamaño real de la memoria asignada puede ser mayor que el tamaño solicitado. Para determinar el número real de bytes asignados, use la función GlobalSize o LocalSize . Si la cantidad asignada es mayor que la cantidad solicitada, el proceso puede usar toda la cantidad.

Las funciones GlobalReAlloc y LocalReAlloc cambian el tamaño o los atributos de un objeto de memoria asignado por GlobalAlloc y LocalAlloc. El tamaño puede aumentar o disminuir.

Las funciones GlobalFree y LocalFree liberan memoria asignada por GlobalAlloc, LocalAlloc, GlobalReAlloc o LocalReAlloc. Para descartar el objeto de memoria especificado sin invalidar el identificador, use la función GlobalDiscard o LocalDiscard . GlobalReAlloc o LocalReAlloc pueden usar el identificador más adelante para asignar un nuevo bloque de memoria asociado al mismo identificador.

Para devolver información sobre un objeto de memoria especificado, use la función GlobalFlags o LocalFlags . La información incluye el recuento de bloqueos del objeto e indica si el objeto se puede descartar o ya se ha descartado. Para devolver un identificador al objeto de memoria asociado a un puntero especificado, use la función GlobalHandle o LocalHandle .

Comparación de métodos de asignación de memoria