Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

9.5.1. Оператори динамічного розподілу пам'яті

Мова C++ містить два оператори – new і delete, які виконують функції з виділення та звільнення пам'яті. Їх загальний формат має такий вигляд:

змінна-покажчик = new тип_змінної;

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

У цьому записі елемент змінна-покажчик є покажчиком на значення, тип якого задано елементом тип_змінної. Оператор new виділяє область пам'яті, достатню для зберігання значення заданого типу, і повертає покажчик на цю область пам'яті. За допомогою оператора new можна виділити пам'ять для значень будь-якого допустимого типу.

Оператор new дає змогу динамічно виділити область пам'яті.

Оператор delete звільняє область пам'яті, яка адресується заданим покажчиком. Після звільнення ця пам'ять може бути знову виділена для інших потреб під час подальшого new-запиту на виділення пам'яті.

Оператор delete звільняє раніше виділену динамічну пам'ять.

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

Така поведінка оператора new у разі неможливості задовольнити запит на виділення пам'яті визначається стандартом мови C++. На таку реалізацію налаштовані також всі сучасні компілятори, в т.ч. останні версії Visual C++ і C++ Builder. Однак йдеться про те, що деякі старіші компілятори обробляють new-настанови дещо по-іншому. Відразу після винайдення мови C++ оператор new під час невдалого виконання повертав нульовий покажчик. Пізніше його реалізація була змінена так, щоб у разі невдачі генерувався виняток, як це було описано вище. Оскільки у цьому навчальному посібнику ми дотримуємося стандарту мови C++, то в усіх представлених тут прикладах передбачається саме генерування винятку. Якщо ж Ви використаєте старіший компілятор, то зверніться до документації, що додається до нього, і уточніть, як реалізований оператор new (у разі потреби внесіть в приклади відповідні зміни).

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

Розглянемо приклад програми, яка ілюструє використання операторів new і delete.

Код програми 9.15. Демонстрація динамічного розподілу пам'яті

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

int main()

{

int *p;

p = new int; // Виділяємо пам'ять для int-значення.

*p = 20; // Поміщаємо в цю область пам'яті значення 20.

cout << *p; // Переконуємося (шляхом виведення на екран) в

// роботоздатності цього коду програми.

delete p; // Звільняємо пам'ять.

getch(); return 0;

}

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

Завдяки такому способу організації динамічного виділення пам'яті оператор delete необхідно використовувати тільки з тим покажчиком на пам'ять, який було повернуто внаслідок new-запиту на виділення пам'яті. Використання оператора delete з іншим типом адреси може викликати серйозні проблеми.