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