Перевірка на виділення пам'яті

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

if (pi == NULL)

printf ( "Необхідна пам'ять не виділена!");

Виділення пам'яті під одновимірний динамічний масив

Для того щоб виділити пам'ять під одновимірний динамічний масив в мові С ++ існує 2 способи.

1) за допомогою операції new. яка виділяє для розміщення масиву ділянку динамічної пам'яті відповідного розміру і не дозволяє форматувати елементи масиву.

/ * Виділення динамічної пам'яті розміром 100 * sizeof (int) байтів * /

mas = new int [100];

/ * Виділення динамічної пам'яті розміром n * sizeof (double) байтів * /

double * m = new double [n];

При виділенні динамічної пам'яті розміри масиву повинні бути повністю визначені.

2) за допомогою бібліотечної функції malloc (calloc)

/ * Виділення динамічної пам'яті розміром 10 * sizeof (float) байтів * /

Так як функція malloc (calloc) повертає нетипізований покажчик void *, то необхідно виконувати перетворення отриманого нетипізованого покажчика в покажчик оголошеного типу.

Двовимірні динамічні масиви

Операції calloc, malloc, new дозволяють виділяти тільки одномірні масиви, тому для роботи з багатовимірними масивами необхідно сприймати їх як масив покажчиків на інші масиви. Для прикладу розглянемо задачу виділення динамічної пам'яті під масив чисел розміру n на m.

1-ий спосіб

На першому кроці виділяється покажчик на масив покажчиків, а на другому етапі, в циклі кожному покажчику з масиву виділяється масив чисел в пам'яті: int ** a = new int * [n];

for (int i = 0; i! = n; ++ i)

Однак, цей спосіб поганий тим, що в ньому потрібно n + 1 виділення пам'яті, а це досить дорога за часом операція.

2ий спосіб

На першому кроці виділення масиву покажчиків і масиву чисел розміром n на m. На другому кроці кожному покажчику з масиву ставиться у відповідність рядок в масиві чисел. int ** a = new int * [n];

for (int i = 1; i! = n; ++ i)

В даному випадку потрібно всього 2 виділення пам'яті.

Щоб звільнити пам'ять потрібно виконати:

delete [] a; Таким чином, другий спосіб знову ж вимагає набагато менше викликів функції delete [], ніж перший.

Схожі статті