Робота з пам’яттю за допомогою new і delete, програмування на c і ​​c

Як відомо, в мові С для динамічного виділення і звільнення пам'яті використовуються фун-кції malloc () і free (). Разом з тим С ++ містить два оператора, що виконують виділення і звільнення пам'яті більш ефективно і більш просто. Цими операторами є new і delete. Їх загальна форма має вигляд:

переменная_указатель = new тіп_переменной;

Якщо операція виділення пам'яті не може бути виконана, то оператор new генерує ис-ключення типу xalloc. Якщо включення програми перехопить це виняток, тоді вона буде знята з виконання. Хоча для коротких програм така поведінка за умовчанням є задовольни-них, для реальних прикладних програм зазвичай потрібно перехопити виняток і обра-ботать його відповідним чином. Для того щоб відстежити це виняток, необхідно вклю-чити заголовки except.h.

Є ряд переваг використання new перед використанням malloc (). По-перше, оператор new автоматично обчислює розмір необхідної пам'яті. Немає необхідності у використанні оператора sizeof (). Більш важливим є те, що він запобігає випадкове виділення неправильної кількості пам'яті. По-друге, оператор new автоматично повертає покажчик необхідного типу, так що немає необхідності у використанні оператора перетворення типу. По-третє, як ско-ро буде описано, є можливість ініціалізації об'єкта при використанні оператора new. І нарешті, є можливість перевантажити оператор new і оператор delete глобально або по відношенню до того класу, який створюється.

Нижче наведено простий приклад використання операторів new і delete. Слід звернути ува-гу на використання блоку try / catch для стеження за вадами виділення пам'яті.

#include
#include
int main ()
int * p;
try p = new int; // виділення пам'яті для int
> Catch (xalloc xa) cout <<"Allocation failure.\n";
return 1;
>
* P = 20; // присвоєння даній ділянці пам'яті значення 20
cout <<*р; // демонстрация работы путем вывода значения
delete р; // звільнення пам'яті
return 0;
>

Як зазначалося, можна форматувати пам'ять з використанням оператора new. Для цього треба вказати инициализирующее значення в дужках після імені типу. Наприклад, в наступному прикладі пам'ять, на яку вказує покажчик р, инициализируется значенням 99:

#include
#include
int main ()
int * p;
try p = new int (99); // ініціалізація 99-ю
> Catch (xalloc xa) cout <<"Allocation failure.\n";
return 1;
>
cout <<*p;
delete p;
return 0;
>

За допомогою new можна розміщувати масиви. Загальна форма для одновимірного масиву має вигляд:

переменная_указатель = new тіп_переменной [розмір];

Тут розмір визначає число елементів в масиві. Необхідно запам'ятати важливе обмеження при розміщенні масиву: його не можна форматувати.

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

Тут дужки [] інформують оператор delete, що необхідно звільнити пам'ять, виділену для масиву.

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

#include
#include
int main ()
float * p;
int i;
try p = new float [10]; // отримання десятого елемента масиву
> Catch (xalloc xa) cout <<"Allocation failure.\n";
return 1;
>
// привласнення значень від 100 до 109
for (i = 0; i<10; i + + ) p[i] = 100.00 + i;
// виведення вмісту масиву
for (i = 0; i<10; i++) cout < delete [] p; // видалення всього масиву
return 0;
>