Для початку обговоримо особливості кожного виду пам'яті.
статична пам'ять
Місце в статичної пам'яті - резервується в момент запуску програми і звільняється тільки після того, як програма завершить свою роботу.
Туди потрапляють глобальні змінні (оголошені поза будь-якими блоків, зокрема, до початку методу main) і статичні змінні (перед типом яких вказується ключове слово static. При цьому змінна може знаходиться де завгодно, в тому числі і в тілі якоїсь функції, але вести статична змінна всередині функції себе буде специфічно: зберігати своє значення між повторними викликами функції). Різниця між статичної та глобальної змінної проявляється, коли програма складається з декількох файлів: глобальні змінні доступні в суміжних файлах, а статичні - тільки в тому файлі, де були оголошені.
У статичної пам'яті не рекомендується тримати довгі об'єкти (наприклад, масиви).
Локальна пам'ять (стековая пам'ять)
Виділяється при вході в блок програми, звільняється - при виході з блоку.
Туди потрапляють змінні оголошені всередині блоків (зокрема, в тілі функцій).
динамічна пам'ять
Виділяється і звільняється - за допомогою спеціальних інструкцій (т. Е. З ініціативи розробника). Це дозволяє по ходу роботи програми контролювати і коригувати обсяг використовуваної пам'яті і, отже, створювати програми здатні обробляти великі обсяги даних, обходячи обмеженість фізичної пам'яті машини.
Доступ до динамічної пам'яті можливий тільки через покажчики, т. Е. Не можна створювати в неї змінні, але можна виділяти її фрагменти і пов'язувати з з деяким покажчиком.
Робота з динамічною пам'яттю
Виділяється пам'ять за допомогою оператора new. а звільняється - за допомогою оператора delete.
У момент, коли динамічна пам'ять виділена, вона повинна бути пов'язана з деяким покажчиком, відповідного типу (при виділенні вказується тип і кількість необхідних осередків даного типу).
Якщо не звільняти динамічну пам'ять, то вона буде зайнята до завершення програми, що є неприйнятним.
При виділенні однієї динамічної змінної (однієї комірки пам'яті), можна відразу форматувати її значення:
Можна виділяти відразу кілька осередків динамічної пам'яті, отримуючи динамічний масив.
Для цього його розмір вказується в квадратних дужках після типу.
Щоб видалити динамічний масив і звільнити пам'ять використовується оператор delete [].
Відразу після створення динамічний масив автоматично заповнюється нулями (на відміну від звичайного масиву в статичної або стековой пам'яті).
Проблема стає особливо гострою, коли в пам'яті губляться цілі масиви (вони займають більше місця, ніж окремі змінні).
На кожному кроці циклу створюється динамічний масив з 100 елементів. Всього таких масивів буде створено 10, але тільки від останнього з них пам'ять буде звільнена після виходу з циклу. 9 масивів продовжать займати місце в пам'яті до кінця програми. 9 масивів * 100 елементів * 4 байта = 3600 байт втраченої пам'яті, яку ніяк не можна використовувати (ні в цій програмі, не в інших запущених).
Дуже важливо після використання динамічної пам'яті не забувати звільняти її в потрібний момент!
- Програма повинна створити динамічний масив з 10 випадкових цілих чисел з відрізка [0; 9] і вивести його на екран на екран. Кожен динамічний масив повинен бути обов'язково видалений з пам'яті відразу після того, як був використаний в останній раз. Обов'язково виконуйте своєчасну очистку пам'яті при вирішенні кожної з наступних завдань.
- Програма повинна створити динамічний масив з n випадкових цілих чисел з відрізка [0; 9] і вивести його на екран на екран. Розмір масиву n запитується у користувача на початку програми.
- Програма повинна створити два масиви з випадковими елементами з діапазону [-25; 25], по 10 елементів в кожному масиві, вивести кожен масив на екран на окремому рядку. Потім програма повинна створити динамічний масив потрібного розміру і скопіювати в нього всі позитивні елементи з перших двох масивів. І вивести вийшов динамічний масив на екран на окремою рядків.
Приклад роботи програми програми:
Вказівка: вкоротити масив - значить створити його змінену копію, не забувши видалити оригінал.
Приклад роботи програми програми:
Приклад роботи програми програми (на другому рядку показаний введення користувача):