Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Elección del método de asignación adecuado
Use las instrucciones siguientes para seleccionar la API de asignación de memoria adecuada para su escenario:
| Scenario | API recomendada | Notas |
|---|---|---|
| Asignaciones de C++ de uso general | new / std::make_unique / std::make_shared |
Opción predeterminada para el código de C++. Usa el montón de CRT internamente. RAII garantiza la limpieza automática. |
| Asignaciones de C de uso general | malloc / calloc / realloc |
Opción predeterminada para el código C. Portátil entre plataformas. |
| Asignaciones mayores de ~1 MB o que requieren control de nivel de página | VirtualAlloc | Asigna en granularidad de página (normalmente 4 KB). Se usa para reservar intervalos de direcciones grandes, páginas de protección o memoria con atributos de protección específicos (PAGE_READWRITE, PAGE_EXECUTE_READ, etc.). |
| Muchas asignaciones pequeñas con control personalizado (por ejemplo, asignador de grupo) | HeapAlloc / MontónCrear | Cree un montón privado para el control de aislamiento o serialización. Use HEAP_NO_SERIALIZE solo si el montón es exclusivamente de un solo subproceso. |
| Interoperabilidad COM (memoria serializado) | CoTaskMemAlloc | Se requiere cuando la memoria cruza los límites del apartamento COM. Los códigos auxiliares generados por MIDL usan CoTaskMemAlloc/CoTaskMemFree. |
| Código heredado mediante memoria móvil | GlobalAlloc / LocalAlloc | Evite el nuevo código. Estos agregan sobrecarga sobre HeapAlloc y existen principalmente para la compatibilidad con versiones anteriores con las operaciones del Portapapeles y ciertas API de Win32 que las requieren. |
Importante
Emparejar siempre las funciones de asignación y desasignación correctamente. La memoria asignada con HeapAlloc debe liberarse con HeapFree , no free() o LocalFree. La combinación de familias de asignación y desasignación provoca daños en el montón que es difícil de diagnosticar.
Note
VirtualAlloc frente a HeapAlloc: VirtualAlloc funciona con granularidad de página (mínimo de 4 KB, reservas alineadas con SYSTEM_INFO.dwAllocationGranularity, normalmente 64 KB). Asignar muchos objetos pequeños con virtualAlloc desperdicia espacio de direcciones. Use HeapAlloc (o malloc/new) para asignaciones pequeñas y frecuentes. Use VirtualAlloc cuando necesite reservar regiones de direcciones grandes, controlar la protección de páginas o implementar asignadores personalizados.
Comparación detallada
A continuación se muestra una breve comparación de los distintos métodos de asignación de memoria:
- CoTaskMemAlloc
- GlobalAlloc
- HeapAlloc
- LocalAlloc
- malloc
- Nuevo
- VirtualAlloc
Aunque las funciones GlobalAlloc, LocalAlloc y HeapAlloc asignan en última instancia memoria del mismo montón, cada una proporciona un conjunto ligeramente diferente de funcionalidad. Por ejemplo, se puede indicar a HeapAlloc que genere una excepción si no se pudo asignar memoria, una funcionalidad no disponible con LocalAlloc. LocalAlloc admite la asignación de identificadores que permiten mover la memoria subyacente mediante una reasignación sin cambiar el valor de identificador, una funcionalidad no disponible con HeapAlloc.
A partir de Windows de 32 bits, GlobalAlloc y LocalAlloc se implementan como funciones contenedoras que llaman a HeapAlloc mediante un identificador para el montón predeterminado del proceso. Por lo tanto, GlobalAlloc y LocalAlloc tienen una sobrecarga mayor que HeapAlloc.
Dado que los diferentes asignadores de montón proporcionan una funcionalidad distintiva mediante diferentes mecanismos, debe liberar memoria con la función correcta. Por ejemplo, la memoria asignada con HeapAlloc debe liberarse con HeapFree y no LocalFree o GlobalFree. La memoria asignada con GlobalAlloc o LocalAlloc debe consultarse, validarse y liberarse con la función global o local correspondiente.
La función VirtualAlloc permite especificar opciones adicionales para la asignación de memoria. Sin embargo, sus asignaciones usan una granularidad de página, por lo que el uso de VirtualAlloc puede dar lugar a un mayor uso de memoria.
La función malloc tiene la desventaja de depender del tiempo de ejecución. El nuevo operador tiene la desventaja de ser dependiente del compilador y dependiente del lenguaje.
La función CoTaskMemAlloc tiene la ventaja de funcionar bien en C, C++o Visual Basic. También es la única manera de compartir memoria en una aplicación basada en COM, ya que MIDL usa CoTaskMemAlloc y CoTaskMemFree para serializar la memoria.
Examples
Temas relacionados