Скачать презентацию Мова С Лекція 13 Динамічний розподіл пам яті Скачать презентацию Мова С Лекція 13 Динамічний розподіл пам яті

Tema_13_Срр.pptx

  • Количество слайдов: 14

Мова С++ Лекція 13 Динамічний розподіл пам’яті Мова С++ Лекція 13 Динамічний розподіл пам’яті

Ключові терміни Динамічна пам'ять - це пам'ять, що виділяється програмі для її роботи за Ключові терміни Динамічна пам'ять - це пам'ять, що виділяється програмі для її роботи за вирахуванням сегмента даних, стека, в якому розміщуються локальні змінні підпрограм і власне тіла програми. Динамічні змінні - це змінні, визначені в області динамічної пам'яті. Операція виділення динамічної пам'яті - це виділення достатнього для розміщення величини ділянки динамічної пам'яті. Операція визволення динамічної пам'яті - це звільнення ділянки динамічної пам'яті, виділеного раніше. Сегмент даних - це безперервна область пам'яті, в якій розміщуються оголошені в програмі змінні. Функція виділення динамічної пам'яті - це функція виділення пам'яті відповідно до значень параметрів, що повертає адресу початку виділеної ділянки пам'яті. Функція звільнення динамічної пам'яті - це функція звільнення динамічної пам'яті, виділеної раніше.

Розподіл оперативної пам'яті для програм на С ++ Вища адреса Область стека Область вільної Розподіл оперативної пам'яті для програм на С ++ Вища адреса Область стека Область вільної пам’яті для динамічного розміщення Область глобальних змінних Область програми Нижча адреса

Варіанти роботи з динамічною пам'яттю, що виділяється в деякому блоці Вказівник (на область динамічної Варіанти роботи з динамічною пам'яттю, що виділяється в деякому блоці Вказівник (на область динамічної пам'яті) визначено як локальний об'єкт автоматичної пам'яті. В цьому випадку виділена пам'ять буде недоступна при виході за межі блоку локалізації вказівника, і її потрібно звільнити перед виходом з блоку. Вказівник визначено як локальний об'єкт статичної пам'яті. Динамічна пам'ять, виділена одноразово в блоці, доступна через покажчик при кожному повторному вході в блок. Пам'ять потрібно звільнити тільки після закінчення її використання. Вказівник є глобальним об'єктом по відношенню до блоку. Динамічна пам'ять доступна у всіх блоках, де "видно" покажчик. Пам'ять потрібно звільнити тільки після закінчення її використання.

Робота з динамічною пам'яттю з допомогою операцій new і delete Синтаксис: new Ім’я. Типу; Робота з динамічною пам'яттю з допомогою операцій new і delete Синтаксис: new Ім’я. Типу; або new Ім’я. Типу [Ініціалізатор]; Синтаксис застосування операції: Вказівник = new Ім’я. Типу [Ініціалізатор]; new float - виділяє ділянку пам'яті розміром 4 байти new int (15) - виділяє ділянку пам'яті 4 байта і ініціалізує цю ділянку цілим значенням 15 Попередньо кожен покажчик повинен бути оголошений: тип *Ім’я. Вказівника; наприклад: float * pi; // Оголошення змінної pi pi = new float; // Виділення пам'яті для змінної pi * Pi = 2. 25; // Присвоєння значення

Оператор new найчастіше використовується для розміщення в пам'яті даних визначених користувачем типів, наприклад, структур: Оператор new найчастіше використовується для розміщення в пам'яті даних визначених користувачем типів, наприклад, структур: struct Node { char *Name; int Value; Node *Next }; Node *PNode; //оголошується вказівник PNode = new Node; //виділяется пам’ять PNode->Name = "Ata"; //присвоюються значення PNode->Value = 1; PNode->Next = NULL;

При виділенні динамічної пам'яті для масиву його розміри повинні бути повністю визначені. ptr = При виділенні динамічної пам'яті для масиву його розміри повинні бути повністю визначені. 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; Звільнення виділеного операцією new ділянки пам'яті Синтаксис delete вказівник; звільняється ділянку пам'яті delete x; звільнення пам'яті, виділеної для масиву delete [ ] указатель;

Робота з динамічною пам'яттю з допомогою бібліотечних функцій malloc (calloc) і free Функції виділення Робота з динамічною пам'яттю з допомогою бібліотечних функцій 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 using namespace std; int _tmain(int argc, _TCHAR* argv[]) { float* t; //Вказівник на блок пам’яті int i, n; printf("n="); //n – кількість елементів scanf("%d", &n); t=(float *)malloc(n*sizeof(float)); for (i=0; i=0; i--){ printf("nx[%d]=%f", i, t[i]); } free(t); //звльнює пам’ять system("pause"); return 0; }

Одномірні динамічні масиви Оголошення одновимірних динамічних масивів (new ) Синтаксис: Тип * Ім’я. Масива; Одномірні динамічні масиви Оголошення одновимірних динамічних масивів (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 (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 Звільнення пам'яті, виділеної під одновимірний динамічний масив 1) за допомогою операції delete Синтаксис: delete [] Ім’я. Масива; delete [] mas; delete [] m; delete [] lm; 2) за допомогою бібліотечної функції free Синтаксис: free (Ім’я. Масива); free (a);

Звернення до елементів одновимірного динамічного масиву Синтаксис: Ім’я. Масива[Вираз. Типу. Константи]; або Ім’я. Масива[ЗначенняІндекса]; Звернення до елементів одновимірного динамічного масиву Синтаксис: Ім’я. Масива[Вираз. Типу. Константи]; або Ім’я. Масива[ЗначенняІндекса]; Приклад: mas[5] – індекс задаєтся як константа, sl[i] – індекс задаєтся як змінна, array[4*p] – індекс задаєтся як как выраз.