C++ статическое продвижение массива к утечке памяти?

Позволяет говорят, что у меня есть что-то как...

void foo()
{
    char c[100];
    printf("this function does nothing useful");
}

Когда нечто называют, оно создает массив на стеке, и когда оно выходит из объема, память освобождена автоматически? Или c уничтожается, но память остается выделенной без способа получить доступ к нему он назад кроме перезапуска компьютера?

5
задан MDonovin 3 May 2010 в 15:01
поделиться

4 ответа

Для ясности, здесь не происходит выделения памяти, здесь происходит выделение стека. Разница существенна, поскольку в первом случае требуется вызов функции, резервирование памяти системой распределения и множество накладных расходов. В отличие от этого, последнее действие включает просто увеличение указателя стека. Распределение стека всегда намного, намного быстрее и, за исключением случаев ошибок, связанных с повреждением стека, всегда очищается при выходе из функции.

3
ответ дан 18 December 2019 в 14:43
поделиться

Освобождается ли память автоматически?

Да. И деструкторы тоже будут вызываться, если вам интересно. Вот почему они относятся к классу хранения auto matic .

(На самом деле для большинства архитектур программа вызывает только эти 100 деструкторов (если есть), а затем сдвигает указатель стека назад на 100 * sizeof (T) байт как «освобождение».)

6
ответ дан 18 December 2019 в 14:43
поделиться

Его нет - все прошло.

Но память сразу же доступна для использования следующей функцией. стек просто реализован как указатель, когда вы выполняете c [100], он перемещает указатель вниз на 100 байт, поэтому следующая запрошенная память идет после c. Когда вы покидаете функцию, указатель стека просто перемещается обратно в предыдущую позицию до того, как вы вошли в функцию. Это очень быстрый и эффективный способ управления памятью по сравнению с new / delete / malloc

0
ответ дан 18 December 2019 в 14:43
поделиться

В этом случае, да, память деаллоцируется. Если бы вы сделали что-то вроде:

int var = 100;
char* c = new char[var];

Тогда это осталось бы после завершения функции.

Однако! В современных ОС вам не придется перезагружаться, чтобы вернуть потерянную память. Вместо этого память будет возвращена после завершения процесса (программы).

4
ответ дан 18 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: