
Tema_13_Срр.pptx
- Количество слайдов: 14
Мова С++ Лекція 13 Динамічний розподіл пам’яті
Ключові терміни Динамічна пам'ять - це пам'ять, що виділяється програмі для її роботи за вирахуванням сегмента даних, стека, в якому розміщуються локальні змінні підпрограм і власне тіла програми. Динамічні змінні - це змінні, визначені в області динамічної пам'яті. Операція виділення динамічної пам'яті - це виділення достатнього для розміщення величини ділянки динамічної пам'яті. Операція визволення динамічної пам'яті - це звільнення ділянки динамічної пам'яті, виділеного раніше. Сегмент даних - це безперервна область пам'яті, в якій розміщуються оголошені в програмі змінні. Функція виділення динамічної пам'яті - це функція виділення пам'яті відповідно до значень параметрів, що повертає адресу початку виділеної ділянки пам'яті. Функція звільнення динамічної пам'яті - це функція звільнення динамічної пам'яті, виділеної раніше.
Розподіл оперативної пам'яті для програм на С ++ Вища адреса Область стека Область вільної пам’яті для динамічного розміщення Область глобальних змінних Область програми Нижча адреса
Варіанти роботи з динамічною пам'яттю, що виділяється в деякому блоці Вказівник (на область динамічної пам'яті) визначено як локальний об'єкт автоматичної пам'яті. В цьому випадку виділена пам'ять буде недоступна при виході за межі блоку локалізації вказівника, і її потрібно звільнити перед виходом з блоку. Вказівник визначено як локальний об'єкт статичної пам'яті. Динамічна пам'ять, виділена одноразово в блоці, доступна через покажчик при кожному повторному вході в блок. Пам'ять потрібно звільнити тільки після закінчення її використання. Вказівник є глобальним об'єктом по відношенню до блоку. Динамічна пам'ять доступна у всіх блоках, де "видно" покажчик. Пам'ять потрібно звільнити тільки після закінчення її використання.
Робота з динамічною пам'яттю з допомогою операцій new і delete Синтаксис: new Ім’я. Типу; або new Ім’я. Типу [Ініціалізатор]; Синтаксис застосування операції: Вказівник = new Ім’я. Типу [Ініціалізатор]; new float - виділяє ділянку пам'яті розміром 4 байти new int (15) - виділяє ділянку пам'яті 4 байта і ініціалізує цю ділянку цілим значенням 15 Попередньо кожен покажчик повинен бути оголошений: тип *Ім’я. Вказівника; наприклад: float * pi; // Оголошення змінної pi pi = new float; // Виділення пам'яті для змінної pi * Pi = 2. 25; // Присвоєння значення
Оператор new найчастіше використовується для розміщення в пам'яті даних визначених користувачем типів, наприклад, структур: struct Node { char *Name; int Value; Node *Next }; Node *PNode; //оголошується вказівник PNode = new Node; //виділяется пам’ять PNode->Name = "Ata"; //присвоюються значення PNode->Value = 1; PNode->Next = NULL;
При виділенні динамічної пам'яті для масиву його розміри повинні бути повністю визначені. ptr = new int [10]; //10 елементів типа int або 40 байтів ptr = new int [ ]; //помилка int *b = new int (10); В даному операторі, крім описаних вище дій, проводиться ініціалізація виділеної динамічної пам'яті значенням 10. int *q = new int [10]; У цьому випадку операція new виконує виділення пам'яті під 10 величин типу int (масиву з 10 елементів) і записує адресу початку цієї ділянки в змінну q, яка може трактуватися як ім'я масиву.
Звільнення виділеного операцією new ділянки пам'яті Синтаксис delete вказівник; звільняється ділянку пам'яті delete x; звільнення пам'яті, виділеної для масиву delete [ ] указатель;
Робота з динамічною пам'яттю з допомогою бібліотечних функцій malloc (calloc) і free Функції виділення та звільнення пам’яти Функція Прототип та короткий опис malloc void * malloc (unsigned s); повертає покажчик на початок області (блоку) динамічної пам'яті довгою в s байт. При невдалому завершенні повертає значення NULL. calloc void * calloc (unsigned n, unsigned m); повертає покажчик на початок області (блоку) обнуленої динамічної пам'яті, виділеної для розміщення n елементів по m байт кожен. При невдалому завершенні повертає значення NULL. realloc void * realloc (void * pt, unsigned ns); змінює розмір блоку раніше виділеної динамічної пам'яті до розміру ns байт, pt - адреса початку змінюваного блоку. Якщо pt дорівнює NULL (пам'ять не виділялася), то функція виконується як malloc. free void * free (void * pt); звільняє раніше виділену ділянку (блок) динамічної пам'яті, адреса першого байта якого дорівнює значенню pt.
Приклад. Ввести і надрукувати в зворотному порядку набір дійсних чисел, кількість яких заздалегідь не фіксована, а вводиться до початку введення самих числових значень. #include “stdafx. h” #include
Одномірні динамічні масиви Оголошення одновимірних динамічних масивів (new ) Синтаксис: Тип * Ім’я. Масива; Приклад: int *a; double *d; Виділення пам'яті під одновимірний динамічний масив Синтаксис: Ім’я. Масива = new Тип [Вираз. Типу. Константи]; Приклад int *mas; mas = new int [100]; /*виділення динамічної пам’яті розміром 100*sizeof(int) байтів*/ double *m = new double [n]; /* виділення динамічної пам’яті розміром n*sizeof(double) байтов*/ long (*lm)[4]; lm = new long [2] [4]; /* виділення динамічної пам’яті розміром 2*4*sizeof(long) байтов*/
Одномірні динамічні масиви Оголошення одновимірних динамічних масивів (malloc (calloc) ) Синтаксис: Ім’я. Масива = (Тип *) malloc(N*sizeof(Тип)); або Ім’я. Масива = (Тип *) calloc(N, sizeof(Тип)); Приклад float *a; a=(float *)malloc(10*sizeof(float)); // або a=(float *)calloc(10, sizeof(float)); /* виділення динамічної пам’яті розміром 10*sizeof(float) байтов*/
Звільнення пам'яті, виділеної під одновимірний динамічний масив 1) за допомогою операції delete Синтаксис: delete [] Ім’я. Масива; delete [] mas; delete [] m; delete [] lm; 2) за допомогою бібліотечної функції free Синтаксис: free (Ім’я. Масива); free (a);
Звернення до елементів одновимірного динамічного масиву Синтаксис: Ім’я. Масива[Вираз. Типу. Константи]; або Ім’я. Масива[ЗначенняІндекса]; Приклад: mas[5] – індекс задаєтся як константа, sl[i] – індекс задаєтся як змінна, array[4*p] – індекс задаєтся як как выраз.