Для динамічного розподілу пам'яті використаються операції new й delete. Операція
new ім'я_типу
або
new ім'я_типу инициализатор
дозволяє виділити й зробити доступна вільна ділянка пам'яті, розміри якого відповідають типу даних, обумовленому ім'ям типу. У виділену ділянку заноситься значення обумовлене инициализатором, що не є обов'язковим параметром. У випадку успішного виділення пам'яті операція повертає адресу початку виділеної ділянки пам'яті, якщо ділянка не може бути виділений, то повертається NULL.
Приклади:
1) int *i;
i=new int(10);
2) float *f;
f=new float;
3) int *mas=new[5];
У прикладах 1, 2 показано як виділити пам'ять під скалярні змінні, приклад 3 показує виділення пам'яті під масив змінних.
Операція delete покажчик звільняє ділянку пам'яті раніше виділений операцією new.
Приклад:
Функція для формування двовимірного динамічного масиву
int ** make_matr(int n)
{
int **matr;
int i,j;
matr=new int*[n];
for (i=0;i<n;i++)
{
matr[i]=new int[n];
for (j=0;j<n;j++)
matr[i][j]=random(10);
}
return matr;
}
При формуванні матриці спочатку виділяється пам'яті для масиву покажчиків на одномірні масиви, а потім у циклі з параметром виділяється пам'ять під n одномірних масивів.
|
|
**matr
*matr[1] | *matr[2] | *matr[3] | .... | *matr[n] |
Щоб звільнити пам'ять необхідно виконати цикл для звільнення одномірних масивів
for(int i=0;i<n;i++)
delete matr[i];
Після цього звільняємо пам'ять на яку вказує покажчик matr
delete [] matr;