C ++ статический массив, приводящий к утечке памяти? - PullRequest
5 голосов
/ 03 мая 2010

Допустим, у меня есть что-то вроде ...

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

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

Ответы [ 4 ]

6 голосов
/ 03 мая 2010

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

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

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

4 голосов
/ 03 мая 2010

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

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

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

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

3 голосов
/ 03 мая 2010

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

0 голосов
/ 03 мая 2010

Все прошло - все прошло.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...