АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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

Читайте также:
  1. Infinite USB Memory – флешка с безлимитным объемом памяти 03.03.2010 16:00 Максим Мишенев
  2. V. Различие в отношении к прошлому опыту между образами памяти и образами воображения
  3. БЛУЖДАНИЯ БЕЗ ПАМЯТИ
  4. В какое распределение в предельном случае переходят распределения Бозе-Эйнштейна и Ферми-Дирака?
  5. ВАЛИНОР: Тропы памяти
  6. Величина, обратная емкости памяти
  7. во Всероссийской Вахте Памяти
  8. Вопрос 21. Распределение времени и повседневный порядок. ( Устав внутренней службы.)
  9. ВОПРОС: Загрузка шихтовых материалов и их распределение на калошнике.
  10. ВОСКРЕШЕНИЕ В ПАМЯТИ
  11. Воспроизводство трудовых ресурсов: формирование, распределение, использование.
  12. Время и самораспределение

Динамическое распределение памяти широко используется для экономии вы числительных ресурсов. Те переменные или объекты, которые становятся ненужными, уничтожаются, а освобожденное место используется для новых переменных или объектов. Это особенно эффективно в задачах, в которых число необходимых объектов зависит от обрабатываемых данных или от действий пользователя, т.е. заранее не известно.

В этих ситуациях остается только два выхода: заранее с запасом отвести место под множество объектов или использовать динамическое распределение памяти, создавая новые объекты по мере надобности. Первый путь неудовлетворительный, поскольку связан с излишними затратами памяти и накладывает на размерность задачи необоснованные ограничения.

Для динамического распределения выделяется специальная область памяти --- heap. Динамическое распределение памяти в этой области может производиться несколькими способами: с помощью библиотечных функций malloc, realloc, free или с помощью операций new и delete.

 

Операция new определяет объем необходимой памяти, который зависит от типа данных. Если в динамически распределяемой области памяти heap есть место для размещения объекта, то выделяется соответствующий блок памяти и операция new возвращает указатель на объект данного типа.

Созданный объект хранится в памяти, пока не будет уничтожен операцией delete или пока не завершится выполнение программы.

Операция new имеет следующий синтаксис:

new <размещение> тип_данных <(инициализатор)>

Все элементы, заключенные в описании синтаксиса в угловые скобки, являются необязательными. Инициализатор задает начальное значение создаваемого объекта.

double *A = new double;

В данном случае в памяти динамически создается объект - действительное число. В дальнейшем доступ к нему осуществляется как *А. Например:

*А=5.1;

double *В = new double(5.5);

Аналогичным образом можно размещать и массивы.

Например, оператор

double *A = new double [100];

динамически размещает массив из 100 действительных чисел. К его элементам в дальнейшем можно обращаться как обычно, по индексу: A[ind]. При использовании для создания массива операции new массив нельзя инициализировать, как это делается с одиночными объектами.

 

Динамически распределенную память надо освобождать, когда отпадает необходимость в размещенных в ней объектах. В противном случае получится неоправданная утечка памяти. Освобождение памяти осуществляется операцией delete. Она освобождает блок памяти, выделенный ранее операцией new.

Операция delete имеет следующие формы записи:

delete <выражение>

delete [ ] <выражение>

delete <имя массива> [ ];

Например:

double *A = new double(5.1);

delete A;

double *В = new double [100];

delete [] В;

Операция delete освобождает память, но сама не задает указателю на эту память значения NULL. Поэтому желательно это делать программно, чтобы случайно в дальнейшем не воспользоваться указателем, который уже ни на что не указывает:

delete A;

А = NULL;

 


1 | 2 | 3 | 4 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)