Лабораторна робота № 26. Динамічне розподілення пам’яті

Мета:

Здобути навики використання середовища розробки мови C++, познайомитися з динамічним розподіленням пам’яті, здобути навички написання програм.

Короткі теоретичні відомості до роботи.

Раніш ми розглядали область дії і час життя змінних, які встановлюються автоматично при напису програми. У С++ передбачена також можливість динамічно виділити і вилучити пам’ять для змінних. Ці дії виконують оператори new і delete у сполучені з показниками.

Нехай:

int *iP;

Виділення пам’яті здійснює вираз

iP=new int;

Оператор new повертає показник типу, що заданий, у виділену пам’ять, достатньою для збереження змінної. Коли пам’яті не достатньо, то повертається показник 0 (нуль).

Після вказівки комп’ютеру про виділену пам’ять, слід перевірити виконання:

if (! iP) {cout<<”\nпомилка ”; pause(0); };

Вираз

delete iP;

звільняє виділену пам’ять.

Коли викликати delete з недійсним показником, тобто з тим, для кого попередньо не виділена пам’ять за допомогою new, в системі розподіленної пам’яті здійснюється збій.

Можлива одночасна ініціалізація змінної. Наприклад,

float *aP= new float(88.1);

Для масиву виділення та звільнення пам’яті виглядає таким чином:

int *mP= new int[12][4]; //показник mPна початок масиву

...

delete[ ] mP

Ініціалізація масивів при динамічному виділенні пам’яті не здійснюється.

Приклади динамічного розподілу пам’яті демонструються у наступній програмі.

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

//файл PART3\3_16.ccp

// динамічний розподіл пам’яті

#include “c:\CPP\SUBPROG\\roll.h”

#include “c:\CPP\SUBPROG\\roll_txt.h”

#include<iomanip.h>

main () { int *iP=new int(77); /* Виділення пам’яті для змінної int

з ініціалізацієї числом 77 */

if (!iP){ cout<<”\nпомилка виділення пам’яті”;

pause(0); }; //перевірення виділенної пам’яті

cout<<”\n “<<*iP<<end1;

delete iP; //звільнення пам’яті

double *mP=new double[7]; //виділення пам’яті для масиву double

if (!mP) {cout<<”\nпомилка виділенної пам’яті”;

for (k=0; k<7; k++) mP[k]=ch();

for (k=0; k<7; k++)

{ cout<<”\n “<<k<<setw(14)<<mP[k]; } cout<<end1;

delete[ ]mP; //звільнення пам’яті

cout<<”\n *** кінець задачі ***”;

pause(0); return 0; }


РЕЗУЛЬТАТ ВИКОНАННЯ ПРОГРАМИ

Далі перевіряється і виділяється пам’ять для масиву на 7 чисел типу double. Після використання масиву пам’ять звільнується. Для раніх версій компілятора при звільнені пам’яті потрібно вказувати кількість елементів масиву.

Оглядові запитання

1. Які дії виконують оператори new і delete?

2. Що здійснює вираз iP=new int;?

3. Що виконує оператор new?

if (! iP) {cout<<”\nпомилка ”; pause(0); };

4. Що здійснює вираз if (! iP) {cout<<”\nпомилка ”; pause(0); };?

5. Що здійснює вираз delete iP;?

6. Що здійснює вираз float *aP= new float(88.1);?

7. Що здійснює вираз if (!mP)?

8. Що здійснює вираз mP[k]=ch();?



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow