Инициализация динамически выделенной памяти



 

Используя оператор new , динамически выделяемую память можно инициализировать. Для этого после имени типа задайте начальное значение, заключив его в круглые скобки. Например, в следующей программе область памяти, адресуемая указателем p , инициализируется значением 99 .

 

Выделение памяти для массивов

 

С помощью оператора new можно выделять память и для массивов. Вот как выглядит общий формат операции выделения памяти для одномерного массива:

 

 

Здесь элемент размер задает количество элементов в массиве.

Чтобы освободить память, выделенную для динамически созданного массива, используйте такой формат оператора delete :

 

 

Здесь элемент переменная‑указатель представляет собой адрес, полученный при выделении памяти для массива (с помощью оператора new ). Квадратные скобки означают для C++, что динамически созданный массив удаляется, а вся область памяти, выделенная для него, автоматически освобождается.

Важно! Более старые С++‑компиляторы могут требовать задания размера удаляемого массива, поскольку в ранних версиях C++ для освобождения памяти, занимаемой удаляемым массивом, необходимо было применять такой формат оператора delete:

 

 

Здесь элемент размер задает количество элементов в массиве. Стандарт C++ больше не требует указывать размер при его удалении.

При выполнении следующей программы выделяется память для 10 ‑элементного массива типа double , который затем заполняется значениями от 100 до 109 , после чего содержимое этого массива отображается на экране.

 

 

При динамическом выделении памяти для массива важно помнить, что его нельзя одновременно и инициализировать.

 

Динамическое распределение памяти в языке С: функции malloc() и free()

 

Язык С не содержит операторов new или delete . Вместо них в С используются библиотечные функции, предназначенные для выделения и освобождения памяти. В целях совместимости C++ по‑прежнему поддерживает С‑систему динамического распределения памяти и не зря: в С++‑программах все еще используются С‑ориентированные средства динамического распределения памяти. Поэтому им стоит уделить внимание.

Ядро С‑системы распределения памяти составляют функции malloc() и free() . Функция malloc() предназначена для выделения памяти, а функция frее() – для ее освобождения. Другими словами, каждый раз, когда с помощью функции malloc() делается запрос, часть свободной памяти выделяется в соответствии с этим запросом. При каждом вызове функции frее() соответствующая область памяти возвращается системе. Любая программа, которая использует эти функции, должна включать заголовок <cstdlib> .

Функция malloc() имеет такой прототип,

 

 

Здесь num_bytes означает количество байтов запрашиваемой памяти. (Тип size_t представляет собой разновидность целочисленного типа без знака.) Функция malloc() возвращает указатель типа void , который играет роль обобщенного указателя. Чтобы из этого обобщенного указателя получить указатель на нужный вам тип, необходимо использовать операцию приведения типов. В результате успешного вызова функция malloc() возвратит указатель на первый байт области памяти, выделенной из "кучи" . Если для удовлетворения запроса свободной памяти в системе недостаточно, функция malloc() возвращает нулевой указатель.

Функция free() выполняет действие, обратное действию функции malloc() в том, что она возвращает системе ранее выделенную ею память. После освобождения память можно снова использовать последующим обращением к функции malloc() . Функция free() имеет такой прототип.

 

 

Здесь параметр ptr представляет собой указатель на память, ранее выделенную с помощью функции malloc() . Никогда не следует вызывать функцию free() с недействительным аргументом; это может привести к разрушению списка областей памяти, подлежащих освобождению.

Использование функций malloc() и free() иллюстрируется в следующей программе.

 

 

Несмотря на то что функции malloc() и fгее() – полностью пригодны для динамического распределения памяти, есть ряд причин, по которым в C++ определены собственные средства динамического распределения памяти. Во‑первых, оператор new автоматически вычисляет размер выделяемой области памяти для заданного типа, т.е. вам не нужно использовать оператор sizeof , а значит, налицо экономия в коде и трудовых затратах программиста. Но важнее то, что автоматическое вычисление не допускает выделения неправильного объема памяти. Во‑вторых, С++‑оператор new автоматически возвращает корректный тип указателя, что освобождает программиста от необходимости использовать операцию приведения типов. В‑третьих, используя оператор new , можно инициализировать объект, для которого выделяется память. Наконец, как будет показано ниже в этой книге, программист может создать собственные версии операторов new и delete .

И последнее. Из‑за возможной несовместимости не следует смешивать функции malloc() и free() с операторами new и delete в одной программе.

 

Сводная таблица приоритетов С++‑операторов

 

В табл. 9.2 показан приоритет выполнения всех С++‑операторов (от высшего до самого низкого). Большинство операторов ассоциированы слева направо. Но унарные операторы , операторы присваивания и оператор "?" ассоциированы справа налево. Обратите внимание на то, что эта таблица включает несколько операторов, которые мы пока не использовали в наших примерах, поскольку они относятся к объектно‑ориентированному программированию (и описаны ниже).

 


Дата добавления: 2018-09-22; просмотров: 505; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!