|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Динамическое распределение памятиДинамическое распределение памяти широко используется для экономии вы числительных ресурсов. Те переменные или объекты, которые становятся ненужными, уничтожаются, а освобожденное место используется для новых переменных или объектов. Это особенно эффективно в задачах, в которых число необходимых объектов зависит от обрабатываемых данных или от действий пользователя, т.е. заранее не известно. В этих ситуациях остается только два выхода: заранее с запасом отвести место под множество объектов или использовать динамическое распределение памяти, создавая новые объекты по мере надобности. Первый путь неудовлетворительный, поскольку связан с излишними затратами памяти и накладывает на размерность задачи необоснованные ограничения. Для динамического распределения выделяется специальная область памяти --- 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;
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.) |