¿Qué es un montón de memoria?

174

¿Qué es un montón de memoria?

H4cKL0rD
fuente

Respuestas:

234

Presumiblemente quiere decir montón desde un punto de vista de asignación de memoria, no desde un punto de vista de estructura de datos (el término tiene múltiples significados).

Una explicación muy simple es que el montón es la porción de memoria donde reside la memoria asignada dinámicamente (es decir, la memoria asignada a través de malloc). La memoria asignada desde el montón permanecerá asignada hasta que ocurra uno de los siguientes:

  1. La memoria es free'd
  2. El programa termina

Si se pierden todas las referencias a la memoria asignada (por ejemplo, ya no almacena un puntero), tiene lo que se llama una pérdida de memoria . Aquí es donde todavía se ha asignado la memoria, pero ya no tiene una manera fácil de acceder. La memoria perdida no se puede reclamar para futuras asignaciones de memoria, pero cuando el programa finalice, el sistema operativo liberará la memoria.

Compare esto con la memoria de la pila , que es donde viven las variables locales (aquellas definidas dentro de un método). La memoria asignada en la pila generalmente solo vive hasta que la función regrese (hay algunas excepciones a esto, por ejemplo, variables locales estáticas).

Puede encontrar más información sobre el montón en este artículo .

LeopardSkinPillBoxHat
fuente
3
¿Cómo podrían las variables locales vivir en una pila? Una pila solo permite tomar una variable a la vez en un orden muy específico. ¿Qué sucede si necesito una variable local de algún lugar más bajo en la pila?
CodyBugstein
9
@ Imray: en un lenguaje de tipo estático, los tamaños de los parámetros locales se conocen en tiempo de compilación. Por lo tanto, se puede acceder directamente a las variables locales directamente desde la pila a través de un desplazamiento de dirección. No es necesario hacer estallar la pila para hacer esto. Vea esta respuesta para más detalles.
LeopardSkinPillBoxHat
17

Un montón de memoria es una ubicación en la memoria donde la memoria puede asignarse con acceso aleatorio.
A diferencia de la pila donde la memoria se asigna y se libera en un orden muy definido, los elementos de datos individuales asignados en el montón generalmente se liberan de manera asincrónica entre sí. Cualquiera de estos elementos de datos se libera cuando el programa libera explícitamente el puntero correspondiente, y esto puede resultar en un montón fragmentado. En oposición, solo se pueden liberar datos en la parte superior (o inferior, dependiendo de la forma en que funcione la pila), lo que da como resultado que los elementos de datos se liberen en el orden inverso al que se asignaron.

mjv
fuente
9

El montón es solo un área donde se asigna o desasigna memoria sin ningún orden. Esto sucede cuando uno crea un objeto usando el newoperador o algo similar. Esto se opone a la pila donde la memoria se desasigna en el primero en el último en salir.

fastcodejava
fuente
8

Un montón de memoria es una estructura común para mantener memoria asignada dinámicamente. Ver Dynamic_memory_allocation en wikipedia.

Hay otras estructuras, como piscinas, pilas y pilas.

Justicle
fuente
7

Es una porción de memoria asignada desde el sistema operativo por el administrador de memoria en uso por un proceso. Las llamadas a malloc()et alia luego toman memoria de este montón en lugar de tener que lidiar directamente con el sistema operativo.

Ignacio Vazquez-Abrams
fuente
7

Probablemente te refieres a memoria de montón, no a memoria de montón.

La memoria de almacenamiento dinámico es esencialmente un gran conjunto de memoria (generalmente por proceso) desde el cual el programa en ejecución puede solicitar fragmentos. Esto generalmente se llama asignación dinámica .

Es diferente de la pila, donde se asignan "variables automáticas". Entonces, por ejemplo, cuando define en una función C una variable de puntero, se asigna suficiente espacio para contener una dirección de memoria en la pila. Sin embargo, a menudo necesitará asignar espacio dinámicamente (con malloc) en el montón y luego proporcionar la dirección donde esta porción de memoria comienza al puntero.

Uri
fuente