Funciones del montón

Cada proceso tiene un montón predeterminado proporcionado por el sistema. Las aplicaciones que realizan asignaciones frecuentes del montón pueden mejorar el rendimiento mediante montones privados.

Un montón privado es un bloque de una o varias páginas en el espacio de direcciones del proceso de llamada. Después de crear el montón privado, el proceso usa funciones como HeapAlloc y HeapFree para administrar la memoria en ese montón.

Las funciones del montón también se pueden usar para administrar la memoria en el montón predeterminado del proceso, mediante el identificador devuelto por la función GetProcessHeap . Las nuevas aplicaciones deben usar las funciones del montón en lugar de las funciones globales y locales para este fin.

No hay ninguna diferencia entre la memoria asignada desde un montón privado y la asignada mediante las demás funciones de asignación de memoria. Para obtener una lista completa de las funciones, consulte la tabla en Funciones de administración de memoria.

Nota

Un subproceso debe llamar a funciones de montón solo para el montón predeterminado del proceso y los montones privados que el subproceso crea y administra, mediante identificadores devueltos por la función GetProcessHeap o HeapCreate .

 

La función HeapCreate crea un objeto de montón privado desde el que el proceso de llamada puede asignar bloques de memoria mediante la función HeapAlloc . HeapCreate especifica un tamaño inicial y un tamaño máximo para el montón. El tamaño inicial determina el número de páginas confirmadas y de lectura y escritura asignadas inicialmente para el montón. El tamaño máximo determina el número total de páginas reservadas. Estas páginas crean un bloque contiguo en el espacio de direcciones virtuales de un proceso en el que el montón puede crecer. Las páginas adicionales se confirman automáticamente desde este espacio reservado si las solicitudes de HeapAlloc superan el tamaño actual de las páginas confirmadas, suponiendo que el almacenamiento físico para él esté disponible. Una vez confirmadas las páginas, no se descommiten hasta que finalice el proceso o hasta que se destruya el montón mediante una llamada a la función HeapDestroy .

La memoria de un objeto de montón privado solo es accesible para el proceso que lo creó. Si una biblioteca de vínculos dinámicos (DLL) crea un montón privado, lo hace en el espacio de direcciones del proceso que llamó al archivo DLL. Solo es accesible para ese proceso.

La función HeapAlloc asigna un número especificado de bytes de un montón privado y devuelve un puntero al bloque asignado. Este puntero se puede usar en las funciones HeapFree, HeapReAlloc, HeapSize y HeapValidate .

La memoria asignada por HeapAlloc no es extraíble. La dirección devuelta por HeapAlloc es válida hasta que el bloque de memoria se libera o reasigna; no es necesario bloquear el bloque de memoria.

Dado que el sistema no puede compactar un montón privado, se puede fragmentar. Las aplicaciones que asignan grandes cantidades de memoria en varios tamaños de asignación pueden usar el montón de fragmentación baja para reducir la fragmentación del montón.

Un posible uso de las funciones del montón es crear un montón privado cuando se inicia un proceso, especificando un tamaño inicial suficiente para satisfacer los requisitos de memoria del proceso. Si se produce un error en la llamada a la función HeapCreate , el proceso puede finalizar o notificar al usuario la escasez de memoria; sin embargo, si se realiza correctamente, el proceso está seguro de tener la memoria que necesita.

La memoria solicitada por HeapCreate puede ser o no contigua. La memoria asignada dentro de un montón por HeapAlloc es contiguo. No debe escribir ni leer desde la memoria en un montón excepto en el asignado por HeapAlloc, ni debe asumir ninguna relación entre dos áreas de memoria asignadas por HeapAlloc.

No debe hacer referencia de ninguna manera a la memoria que ha sido liberado por HeapFree. Después de liberar la memoria, cualquier información que pueda haber estado en ella se ha ido para siempre. Si necesita información, no libere memoria que contenga la información. Es posible que las llamadas de función que devuelvan información sobre la memoria (como HeapSize) no se usen con memoria libre, ya que pueden devolver datos falsos.

La función HeapDestroy destruye un objeto de montón privado. Descommite y libera todas las páginas del objeto de montón y invalida el identificador del montón.

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