Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Резервирование и освобождение памяти (операторы new и delete)




Указатели на указатели

Поскольку массив в С++ реализован как указатель на его элементы, то массив указателей неявно определяет новый производный тип данных – указатель на указатель.

Объявление

int **p;

говорит о том, что p – указатель на указатель, то есть содержит адрес другого указателя, а операция *, дважды примененная к указателю p, даст значение типа int. Понятно, что можно определить указатель на указатель на указатель и т.д., то есть переменные с адресами могут образовывать некоторую иерархию (быть многоуровневыми). Например,

int ***v;

определяет указатель на указатель на указатель.

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

Оператор new резервирует в области динамической памяти запрошенный участок памяти и возвращает его адрес, а оператор delete освобождает зарезервированный ранее участок памяти. Возможный формат этих операторов:

идентификатор = new тип;

delete идентификатор;

Здесь идентификатор – имя указателя, получающего в качестве значения адрес выделенной памяти, достаточной для размещения данных указанного типа. Пример:

int *ip; // указатель на целое значение типа int

...

ip = new int; // резервирование памяти для целого числа

...

delete ip; // освобождение памяти, адресуемой указателем ip

После выполнения последнего оператора примера память, выделенная для переменной типа int и адресуемая указателем ip, становится свободной (недоступной для использования, но доступной для нового резервирования оператором new). Переменная-указатель ip по-прежнему может использоваться в программе, но в текущий момент времени его значение становится неопределенным, указывающим на недоступный участок памяти.

Объявление указателя и резервирование памяти можно объединить:

int *ip = new int; // объявление и инициализация указателя на целое число

Приведенное объявление инициализирует переменную-указатель ip адресом выделенного ей участка памяти для переменной типа int, при этом значение данного участка памяти не определено. Существует возможность применения оператора new с инициализацией выделяемого участка памяти соответствующим значением. Формат оператора new при такой инициализации:

идентификатор = new тип (значение);

например:

int *ip = new int(10); // выделение участка памяти для целого числа

// и его инициализация значением 10

Последний оператор объявляет переменную-указатель ip, резервирует требуемый участок памяти, присваивает этот адрес объявленной переменной и записывает по данному адресу начальное значение 10.

Для резервирования памяти для одномерного массива следует использовать оператор new формата

идентификатор = new тип [ размер ]

а для его освобождения – оператор delete формата

delete [] идентификатор;

например:

int *p = new int[5]; // выделение памяти для массива из пяти целых чисел

...

delete []p; // освобождение памяти, зарезервированной для массива p

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

Размер участка памяти, выделяемой для одномерного массива, может задаваться как целочисленным константным выражением, так и выражением, содержащим переменные, например:

int n;

...

cin >> n;

int *p = new int[n]; // выделение памяти для массива из n целых чисел

Инициализация элементов массива, определяемого посредством оператора new, в C++ не предусмотрена.

Не следует забывать о различиях в использовании квадратных и круглых скобок при работе с динамической памятью. Так, оператор:

int *p = new int[n];

осуществляет выделение памяти для массива из n целых чисел, а похожий оператор

int *p = new int(n);

– выделение памяти для одной переменной целого типа с начальным значением n.

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

Для освобождения памяти, динамически (с помощью оператора new) выделенной под двумерный массив a, следует использовать тот же, что и для одномерного массива, оператор

delete []a;

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

Следует подчеркнуть, что динамически (с помощью оператора delete) можно освободить только ту память, которая была динамически (с помощью оператора new) получена.




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


Дата добавления: 2014-01-04; Просмотров: 286; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.