Мета:
Здобути навики використання середовища розробки мови 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();?