Позволяет говорят, что у меня есть что-то как...
void foo()
{
char c[100];
printf("this function does nothing useful");
}
Когда нечто называют, оно создает массив на стеке, и когда оно выходит из объема, память освобождена автоматически? Или c уничтожается, но память остается выделенной без способа получить доступ к нему он назад кроме перезапуска компьютера?
Для ясности, здесь не происходит выделения памяти, здесь происходит выделение стека. Разница существенна, поскольку в первом случае требуется вызов функции, резервирование памяти системой распределения и множество накладных расходов. В отличие от этого, последнее действие включает просто увеличение указателя стека. Распределение стека всегда намного, намного быстрее и, за исключением случаев ошибок, связанных с повреждением стека, всегда очищается при выходе из функции.
Освобождается ли память автоматически?
Да. И деструкторы тоже будут вызываться, если вам интересно. Вот почему они относятся к классу хранения auto
matic .
(На самом деле для большинства архитектур программа вызывает только эти 100 деструкторов (если есть), а затем сдвигает указатель стека назад на 100 * sizeof (T)
байт как «освобождение».)
Его нет - все прошло.
Но память сразу же доступна для использования следующей функцией. стек просто реализован как указатель, когда вы выполняете c [100], он перемещает указатель вниз на 100 байт, поэтому следующая запрошенная память идет после c. Когда вы покидаете функцию, указатель стека просто перемещается обратно в предыдущую позицию до того, как вы вошли в функцию. Это очень быстрый и эффективный способ управления памятью по сравнению с new / delete / malloc
В этом случае, да, память деаллоцируется. Если бы вы сделали что-то вроде:
int var = 100;
char* c = new char[var];
Тогда это осталось бы после завершения функции.
Однако! В современных ОС вам не придется перезагружаться, чтобы вернуть потерянную память. Вместо этого память будет возвращена после завершения процесса (программы).