Что такое куча памяти?

Ответы:

234

Предположительно вы имеете в виду кучу с точки зрения выделения памяти, а не с точки зрения структуры данных (термин имеет несколько значений).

Очень простое объяснение состоит в том, что куча - это часть памяти, в которой находится динамически распределенная память (т.е. память, выделенная через malloc). Память, выделенная из кучи, останется выделенной, пока не произойдет одно из следующих событий:

  1. Память free«д
  2. Программа заканчивается

Если все ссылки на выделенную память потеряны (например, вы больше не храните указатель на нее), у вас есть то, что называется утечкой памяти . Это место, где память все еще была выделена, но у вас больше нет простого доступа к ней. Утечка памяти не может быть восстановлена ​​для будущих распределений памяти, но когда программа завершится, память будет освобождена операционной системой.

Сравните это со стековой памятью, в которой живут локальные переменные (определенные в методе). Память, выделенная в стеке, обычно живет только до тех пор, пока функция не вернется (есть некоторые исключения из этого, например, статические локальные переменные).

Вы можете найти больше информации о куче в этой статье .

LeopardSkinPillBoxHat
источник
3
Как локальные переменные могут жить в стеке? Стек позволяет принимать только одну переменную за раз в очень специфическом порядке. Что если мне понадобится локальная переменная из более низкого стека?
CodyBugstein
9
@Imray - в статически типизированном языке размеры локальных параметров известны во время компиляции. Поэтому к локальным переменным можно просто получить доступ непосредственно из стека через смещение адреса. Для этого не нужно вставлять стек. Смотрите этот ответ для более подробной информации.
LeopardSkinPillBoxHat
17

Куча памяти - это место в памяти, где память может быть выделена при произвольном доступе.
В отличие от стека, в котором память выделяется и освобождается в очень определенном порядке, отдельные элементы данных, выделенные в куче, обычно освобождаются асинхронно друг от друга. Любой такой элемент данных освобождается, когда программа явно освобождает соответствующий указатель, и это может привести к фрагментарной куче. В противоположность, могут быть освобождены только данные сверху (или снизу, в зависимости от того, как работает стек), в результате чего элемент данных освобождается в обратном порядке, в котором они были выделены.

MJV
источник
9

Куча - это просто область, где память выделяется или освобождается без какого-либо порядка. Это происходит, когда кто-то создает объект, используя newоператор или что-то подобное. Это противоположно стеку, где память освобождается в порядке очереди.

fastcodejava
источник
8

Куча памяти - это общая структура для хранения динамически выделяемой памяти. Смотрите Dynamic_memory_allocation в Википедии.

Существуют и другие сооружения, такие как бассейны, штабеля и сваи.

Justicle
источник
7

Это кусок памяти, выделенный из операционной системы диспетчером памяти, используемым процессом. Призывы к malloc()et alia затем извлекают память из этой кучи вместо того, чтобы иметь дело с операционной системой напрямую.

Игнасио Васкес-Абрамс
источник
7

Вы, вероятно, имеете в виду кучу памяти, а не кучу памяти.

Кучи памяти - это, по сути, большой пул памяти (обычно на процесс), из которого работающая программа может запрашивать порции. Обычно это называется динамическим распределением .

Он отличается от стека, где расположены «автоматические переменные». Так, например, когда вы определяете в функции C переменную-указатель, в стеке выделяется достаточно места для хранения адреса памяти. Однако вам часто потребуется динамически распределять пространство (с помощью malloc) в куче, а затем указывать адрес, с которого этот фрагмент памяти начинает указатель.

Uri
источник