Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы Осадчий А.В. гр.010902.docx
Скачиваний:
8
Добавлен:
24.04.2019
Размер:
143.34 Кб
Скачать

20. Использование операции new и delete.

Операция new, выполненная на некоторым типом, резервирует место в свободной памяти (в кучке), необходимое для хранения значения этого типа. Результатом операции является адрес выделенной памяти или 0, если выделить память не удалось. Тип результата - "указатель на базовый тип”.

Standart C++ выбрасывает исключение в случае невозможности выделить память. Исключения будут обсуждаться позже.

Пример. Выделение памяти для вещественного числа.

float* pf;

pf = new float;

// или

float* pf = new float;

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

*pf = 3.14;

float f = *pf + 1.414;

Операция new не инициализирует выделенную память, т.е. не заполняет ее никакими значениями. Если нужна инициализация, ее надо выполнять явно.

float* pf = new float(0); // заполнение нулем

Когда надобность в выделенной памяти отпадает, ее надо освободить при помощи операции delete.

delete pf;

Операции new и delete выполняют динамическое распределение и отмену распределения памяти, аналогично, но с более высоким приоритетом, нежели стандартныке библиотечные функции семейства malloc и free.

Упрощенный синтаксис:

указатель-имени = new имя <инициализатор-имени>;

delete указатель-имени;

Имя может быть любого типа.

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

В случае успешного завершения new возвращает указатель нового объекта. Пустой указатель означает неудачное завершение операции (например, недостаточный объем или слишком большая фрагментированность кучи). Как и в случае malloc, прежде чем пытаться обращаться к новому объекту, следует проверить укеазатель на наличие пустого значения. Однако, в отличие от malloc, new сама вычисляет размер "имени", и явно указывать операцию sizeof нет необходимости. Далее возвращаемый указатель будет иметь правильный тип, "указатель имени", без необходимости явного приведения типов.

Чаще всего операции new и delete применяются, для создания динамических массивов, а не для создания динамических переменных. Рассмотрим фрагмент кода, создания одномерного динамического массива.?

// объявление одномерного динамического массива на 10 элементов:

float *ptrarray = new float [10];

//  где ptrarray  – указатель на выделенный участок памяти под массив вещественных чисел  типа float

//      в квадратных скобочках указываем размер массива

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

// высвобождение памяти отводимой под одномерный динамический массив:

delete [] ptrarray;

После оператора delete ставятся квадратные скобочки, которые говорят о том, что высвобождается участок памяти, отводимый под одномерный массив.