¿Qué es un Montón de Memoria?


¿Qué es un montón de memoria ?

 119
Author: H4cKL0rD, 2010-02-22

6 answers

Presumiblemente quieres decir heap 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 dinámicamente asignada memoria (es decir, memoria asignada a través de malloc). La memoria asignada desde el montón permanecerá asignada hasta que se produzca una de las siguientes situaciones:

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

Si se pierden todas las referencias a la memoria asignada (por ejemplo, ya no almacena un puntero a ella), tiene lo que se llama una fuga de memoria . Aquí es donde la memoria todavía se ha asignado, pero ya no tiene una forma fácil de acceder a ella. La memoria filtrada no puede ser reclamada para futuras asignaciones de memoria, pero cuando el programa termine la memoria será liberada por el sistema operativo.

Contraste esto con pila memoria que es donde local las variables (las definidas dentro de un método) viven. La memoria asignada en la pila generalmente solo permanece hasta que la función regresa (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.

 160
Author: LeopardSkinPillBoxHat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-02 17:14:29

Una memoria montón es una ubicación en la memoria donde la memoria se puede asignar en el acceso aleatorio.
A diferencia de la pila cuando la memoria se asigna y libera en un orden muy definido, los elementos de datos individuales asignados en el montón se liberan típicamente de manera asíncrona entre sí. Cualquier elemento de datos se libera cuando el programa libera explícitamente el puntero correspondiente, y esto puede resultar en un montón fragmentado. Solo en oposición los datos en la parte superior (o en la parte inferior, dependiendo de la forma en que funciona la pila) pueden liberarse, lo que resulta en que los elementos de datos se liberen en el orden inverso en que se asignaron.

 10
Author: mjv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 04:25:27

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

Hay otras estructuras, como pools, stacks y piles.

 6
Author: Justicle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-01 06:45:09

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

 5
Author: Ignacio Vazquez-Abrams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 04:18:34

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

La memoria de montón es esencialmente un gran conjunto de memoria (típicamente por proceso) desde la cual el programa en ejecución puede solicitar trozos. Esto se llama típicamente asignación dinámica.

Es diferente de la Pila, donde se asignan las "variables automáticas". Así, por ejemplo, cuando se define en una función C una variable puntero, suficiente espacio para contener una dirección de memoria se asigna en la pila. Sin embargo, a menudo tendrá que asigne dinámicamente espacio (Con malloc) en el montón y luego proporcione la dirección donde comienza este fragmento de memoria al puntero.

 5
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 04:21:26

Heap es solo un área donde la memoria es asignada o desasignada sin ningún orden. Esto sucede cuando se crea un objeto usando el operador new o algo similar. Esto se opone a la pila donde la memoria se desasignaen la primera base de entrada y salida.

 4
Author: fastcodejava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-22 05:00:19