Є два місця, де змінні можна помістити в пам’ять. Коли ви створюєте таку змінну:
int a;
char c;
char d[16];
Змінні створюються в " стеку ". Змінні стека автоматично звільняються, коли вони виходять за межі області дії (тобто коли код більше не може до них дістатися). Ви можете почути їх як "автоматичні" змінні, але це вийшло з моди.
Багато прикладів для початківців використовуватимуть лише змінні стека.
Стек хороший, оскільки він автоматичний, але він також має два недоліки: (1) Компілятор повинен заздалегідь знати, наскільки великі змінні, і (b) простір стека дещо обмежений. Наприклад: у Windows у налаштуваннях за замовчуванням для компоновника Microsoft стек встановлений у 1 МБ, і не всі вони доступні для ваших змінних.
Якщо ви не знаєте під час компіляції, наскільки великий ваш масив, або якщо вам потрібен великий масив або структура, вам потрібен "план B".
План Б називається « купа ». Зазвичай ви можете створювати такі великі розміри, наскільки вам дозволяє операційна система, але ви повинні зробити це самостійно. Раніше публікації показували вам один із способів це зробити, хоча є й інші способи:
int size;
char *p = (char *)malloc(size);
(Зверніть увагу, що змінні в купі не маніпулюють безпосередньо, а за допомогою покажчиків)
Після створення змінної купи, проблема полягає в тому, що компілятор не може визначити, коли ви закінчили з нею, тому ви втрачаєте автоматичний випуск. Ось тут і з’являється «ручний випуск», про який ви мали на увазі. Ваш код тепер відповідає за те, щоб вирішити, коли змінна більше не потрібна, і випустити її, щоб пам’ять можна було взяти для інших цілей. У наведеному вище випадку з:
free(p);
Що робить цей другий варіант «неприємним бізнесом», так це те, що не завжди легко зрозуміти, коли змінна вже не потрібна. Якщо ви забудете випустити змінну, коли вона вам не потрібна, ваша програма споживатиме більше пам'яті, ніж їй потрібно. Ця ситуація називається "витоком". «Витік» пам’яті не можна використовувати ні для чого, поки ваша програма не закінчиться і ОС не відновить усі свої ресурси. Навіть більш неприємні проблеми можливі, якщо помилково випустити змінну купи до того, як ви фактично закінчите з нею.
У C та C ++ ви несете відповідальність за очищення змінних кучі, як показано вище. Однак існують мови та середовища, такі як Java та .NET, такі як C #, які використовують інший підхід, коли купа очищається самостійно. Цей другий метод, який називається "збір сміття", набагато простіший для розробника, але ви сплачуєте штраф накладними витратами та продуктивністю. Це баланс.
(Я розглянув багато деталей, щоб дати простішу, але, сподіваюся, більш рівноцінну відповідь)