Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lexzii_08 / Lexs_7_klaccy_pamjt.doc
Скачиваний:
22
Добавлен:
17.05.2015
Размер:
179.2 Кб
Скачать

7. Операції new I delete для динамічного розподілу пам'яті

Мова C++ виділяє дві операції для динамічного розподілу пам'яті – new і delete. Операції new і delete виконують динамічний розподіл і скасування розподілу пам‘яті, але з більш високим пріоритетом, ніж стандартні бібліотечні функції malloc і free. Формат їхній є таким:

<змінна покажчик> = new <тип змінної> (<ініціалізатор>);

delete(<змінна покажчик >);

де змінна покажчик — змінна типу покажчик; ініціалізатор – вираз у круглих дужках.

Операція new дозволяє виділити і зробити доступною ділянку в основній пам'яті, розміри якої відповідають типу даних, що визначається ім'ям типу. У виділену ділянку заноситься значення, що визначається ініціалізатором, який не є обов'язковим елементом. У разі успішного виконання операції new повертає адресу початку виділеної ділянки пам'яті. Якщо ділянка потрібних розмірів не може бути виділена, то операція new повертає нульовий покажчик (NULL).

Покажчик, якому присвоюється значення адреси, що отримується, має відноситися до того самого типу даних, що й <тип змінної> в операції new. Наприклад, new float;

new int(15);

У першому випадку операція new виділяє ділянку пам'яті розміром 4 байти, у другому — ділянку пам'яті в 2 байти й ініціалізує цю ділянку значенням 15.

int *h; // визначення покажчика

h = new int(2); // виділення пам'яті для int і ініціалізація 2

……….

delete h; // звільнення пам'яті

Покажчик h пов'язаний з ділянкою пам'яті, виділеною для величини цілого типу. Надалі доступ до виділеної ділянки пам'яті забезпечує вираз *h.

При виділенні пам'яті для масиву запис операції буде таким:

<змінна покажчик > = new <тип змінної> [<розмірність>];

Повертаний new покажчик, вказує на перший елемент масиву. Наприклад,

int *mat_ptr = new int[3][10];

Буде виділена ділянка динамічної пам'яті розміром 3*10*4 байти.

При виділенні динамічної пам'яті для масиву його розміри мають бути повністю визначені. Тільки перший (найлівіший) розмір масиву може бути заданий з допомогою змінної, інші розміри багатомірного масиву можуть бути визначені лише за допомогою констант.

Тривалість існування виділеної за допомогою операції new ділянки пам'яті — від точки її створення до кінця програми або до явного її звільнення за допомогою операції delete.

delete <змінна покажчик >;

де покажчик адресує ділянку пам'яті, що звільняється, раніше виділену за допомогою операції new. Повторне застосування delete до того самого покажчика дає невизначений результат.

Для звільнення динамічно розміщеного масиву необхідно використати таку форму запису delete:

delete[ ] <змінна покажчик >;

Квадратні дужки повідомляють про те, що необхідно звільнити пам'ять, виділену для масиву. Наприклад,

delete[ ] matr_ptr;

Приклад. Виділяється пам'ять для 10 елементів масиву типу float. Елементам масиву присвоюються значення від 100 до 109. Вміст масиву виводиться на екран.

#include <iostream.h>

void main()

{

float *p; int i;

p = new float[ 10];

for (i = 0; і < 10; i++)

*(p + i)= 100 + i;

for (i = 0; і < 10; i++)

cout << *(p+i);

delete [ ] p;

}

Операція new має ряд переваг перед функцією malloc().

  • По-перше, new автоматично обчислює розмір пам'яті, немає необхідності використати операцію sizeof.

  • По-друге, операція new автоматично повертає покажчик необхідного типу, немає необхідності використовувати операцію перетворення типу.

  • По-третє, є можливість ініціалізації об'єкта при використанні операції new.

8

Соседние файлы в папке lexzii_08