Динамическое распределение памяти

Поделись знанием:
Перейти к: навигация, поиск

Динамическое распределение памяти — способ выделения оперативной памяти компьютера для объектов в программе, при котором выделение памяти под объект осуществляется во время выполнения программы.

При динамическом распределении памяти объекты размещаются в т.н. «куче» (англ. heap): при конструировании объекта указывается размер запрашиваемой под объект памяти, и, в случае успеха, выделенная область памяти, условно говоря, «изымается» из «кучи», становясь недоступной при последующих операциях выделения памяти. Противоположная по смыслу операция — освобождение занятой ранее под какой-либо объект памяти: освобождаемая память, также условно говоря, возвращается в «кучу» и становится доступной при дальнейших операциях выделения памяти.

По мере создания в программе новых объектов, количество доступной памяти уменьшается. Отсюда вытекает необходимость постоянно освобождать ранее выделенную память. В идеальной ситуации программа должна полностью освободить всю память, которая потребовалась для работы. По аналогии с этим, каждая процедура (функция или подпрограмма) должна обеспечить освобождение всей памяти, выделенной в ходе выполнения процедуры. Некорректное распределение памяти приводит к т.н. «утечкам» памяти, когда выделенная память не освобождается. Многократные утечки памяти могут привести к исчерпанию всей оперативной памяти и нарушить работу операционной системы.

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

Для управления динамическим распределением памяти используется «сборщик мусора» — программный объект, который следит за выделением памяти и обеспечивает её своевременное освобождение. Сборщик мусора также следит за тем, чтобы свободные блоки имели максимальный размер, и, при необходимости, осуществляет дефрагментацию памяти.





Элементы реализации

Язык программирования C (Си)

В языке программирования Си имеются следующие четыре функции для динамического распределения памяти, входящие в стандартную библиотеку:

  • malloc (от англ. memory allocation, выделение памяти),
  • calloc (от англ. clear allocation, чистое выделение памяти)
  • realloc (от англ. reallocation, перераспределение памяти).
  • free (англ. free, освободить)

Эти функции имеют следующие описания:

#include <stdlib.h>

void *malloc (size_t size);
void *calloc (size_t num, size_t size);
void *realloc(void *block, size_t size);
void free(void *block);

В C++ имеются два оператора:

Язык программирования Object Pascal

В Object Pascal имеются два оператора:

  • New
  • Dispose

См. также

Источники

  • [www.opengroup.org/onlinepubs/009695399/functions/malloc.html malloc] (англ.). — Описание функции malloc в стандарте POSIX. [www.webcitation.org/67lLvV8r7 Архивировано из первоисточника 19 мая 2012].
  • [www.opengroup.org/onlinepubs/009695399/functions/calloc.html calloc] (англ.). — Описание функции calloc в стандарте POSIX. [www.webcitation.org/67lLw3l3K Архивировано из первоисточника 19 мая 2012].


Напишите отзыв о статье "Динамическое распределение памяти"

Отрывок, характеризующий Динамическое распределение памяти

– Un conseil d'ami, mon cher. Decampez et au plutot, c'est tout ce que je vous dis. A bon entendeur salut! Прощайте, мой милый. Ах, да, – прокричал он ему из двери, – правда ли, что графиня попалась в лапки des saints peres de la Societe de Jesus? [Дружеский совет. Выбирайтесь скорее, вот что я вам скажу. Блажен, кто умеет слушаться!.. святых отцов Общества Иисусова?]
Пьер ничего не ответил и, нахмуренный и сердитый, каким его никогда не видали, вышел от Растопчина.

Когда он приехал домой, уже смеркалось. Человек восемь разных людей побывало у него в этот вечер. Секретарь комитета, полковник его батальона, управляющий, дворецкий и разные просители. У всех были дела до Пьера, которые он должен был разрешить. Пьер ничего не понимал, не интересовался этими делами и давал на все вопросы только такие ответы, которые бы освободили его от этих людей. Наконец, оставшись один, он распечатал и прочел письмо жены.
«Они – солдаты на батарее, князь Андрей убит… старик… Простота есть покорность богу. Страдать надо… значение всего… сопрягать надо… жена идет замуж… Забыть и понять надо…» И он, подойдя к постели, не раздеваясь повалился на нее и тотчас же заснул.
Когда он проснулся на другой день утром, дворецкий пришел доложить, что от графа Растопчина пришел нарочно посланный полицейский чиновник – узнать, уехал ли или уезжает ли граф Безухов.
Человек десять разных людей, имеющих дело до Пьера, ждали его в гостиной. Пьер поспешно оделся, и, вместо того чтобы идти к тем, которые ожидали его, он пошел на заднее крыльцо и оттуда вышел в ворота.
С тех пор и до конца московского разорения никто из домашних Безуховых, несмотря на все поиски, не видал больше Пьера и не знал, где он находился.


Ростовы до 1 го сентября, то есть до кануна вступления неприятеля в Москву, оставались в городе.
После поступления Пети в полк казаков Оболенского и отъезда его в Белую Церковь, где формировался этот полк, на графиню нашел страх. Мысль о том, что оба ее сына находятся на войне, что оба они ушли из под ее крыла, что нынче или завтра каждый из них, а может быть, и оба вместе, как три сына одной ее знакомой, могут быть убиты, в первый раз теперь, в это лето, с жестокой ясностью пришла ей в голову. Она пыталась вытребовать к себе Николая, хотела сама ехать к Пете, определить его куда нибудь в Петербурге, но и то и другое оказывалось невозможным. Петя не мог быть возвращен иначе, как вместе с полком или посредством перевода в другой действующий полк. Николай находился где то в армии и после своего последнего письма, в котором подробно описывал свою встречу с княжной Марьей, не давал о себе слуха. Графиня не спала ночей и, когда засыпала, видела во сне убитых сыновей. После многих советов и переговоров граф придумал наконец средство для успокоения графини. Он перевел Петю из полка Оболенского в полк Безухова, который формировался под Москвою. Хотя Петя и оставался в военной службе, но при этом переводе графиня имела утешенье видеть хотя одного сына у себя под крылышком и надеялась устроить своего Петю так, чтобы больше не выпускать его и записывать всегда в такие места службы, где бы он никак не мог попасть в сражение. Пока один Nicolas был в опасности, графине казалось (и она даже каялась в этом), что она любит старшего больше всех остальных детей; но когда меньшой, шалун, дурно учившийся, все ломавший в доме и всем надоевший Петя, этот курносый Петя, с своими веселыми черными глазами, свежим румянцем и чуть пробивающимся пушком на щеках, попал туда, к этим большим, страшным, жестоким мужчинам, которые там что то сражаются и что то в этом находят радостного, – тогда матери показалось, что его то она любила больше, гораздо больше всех своих детей. Чем ближе подходило то время, когда должен был вернуться в Москву ожидаемый Петя, тем более увеличивалось беспокойство графини. Она думала уже, что никогда не дождется этого счастия. Присутствие не только Сони, но и любимой Наташи, даже мужа, раздражало графиню. «Что мне за дело до них, мне никого не нужно, кроме Пети!» – думала она.