Есть два места, где переменные могут быть помещены в память. Когда вы создаете переменную, как это:
int a;
char c;
char d[16];
Переменные создаются в " стек ". Переменные стека автоматически освобождаются, когда они выходят из области видимости (то есть, когда код больше не может их достичь). Вы можете слышать, что они называются «автоматическими» переменными, но это вышло из моды.
Во многих примерах для начинающих будут использоваться только переменные стека.
Стек хорош, потому что он автоматический, но у него также есть два недостатка: (1) компилятор должен заранее знать, насколько велики переменные, и (b) пространство стека несколько ограничено. Например: в Windows при настройках по умолчанию для компоновщика Microsoft стек имеет значение 1 МБ, и не все из них доступны для ваших переменных.
Если вы не знаете во время компиляции, насколько велик ваш массив, или если вам нужен большой массив или структура, вам нужен «план Б».
План Б называется " куча ". Обычно вы можете создавать переменные настолько большие, насколько позволяет операционная система, но вы должны сделать это сами. Более ранние публикации показали вам, как вы можете это сделать, хотя есть и другие способы:
int size;
// ...
// Set size to some value, based on information available at run-time. Then:
// ...
char *p = (char *)malloc(size);
(Обратите внимание, что переменные в куче не обрабатываются напрямую, а через указатели)
Когда вы создаете переменную кучи, проблема в том, что компилятор не может определить, когда вы покончили с этим, поэтому вы теряете автоматическое освобождение. Вот тут и начинается «ручное освобождение», на которое вы ссылались. Теперь ваш код отвечает за решение, когда переменная больше не нужна, и освобождает ее, чтобы использовать память для других целей. Для случая выше, с:
free(p);
Что делает этот второй вариант "неприятным делом", так это то, что не всегда легко узнать, когда переменная больше не нужна. Если вы забудете освободить переменную, когда она вам не нужна, ваша программа будет использовать больше памяти, чем нужно. Эта ситуация называется «утечка». Утечка памяти не может быть использована ни для чего, пока ваша программа не завершится и ОС не восстановит все свои ресурсы. Еще более неприятные проблемы возможны, если вы выпустили переменную кучи по ошибке до , с которой вы действительно покончили.
В C и C ++ вы несете ответственность за очистку переменных кучи, как показано выше. Однако существуют языки и среды, такие как языки Java и .NET, такие как C #, которые используют другой подход, когда куча очищается самостоятельно. Этот второй метод, называемый сборщиком мусора, намного проще для разработчика, но вы платите штраф за накладные расходы и производительность. Это баланс.
(я упустил из виду многие детали, чтобы дать более простой, но, надеюсь, более выровненный ответ)