Освобождается ли утечка памяти при выходе из программы? - PullRequest
88 голосов
/ 04 июня 2010

Если я запрограммировал - не зная об этом - утечка памяти, и приложение завершает работу, освобождается ли утечка памяти?

Ответы [ 6 ]

118 голосов
/ 04 июня 2010

Да, «утечка памяти» - это просто память, на которую процесс больше не ссылается и, следовательно, больше не может быть свободной. ОС по-прежнему отслеживает всю память, выделенную для процесса, и освобождает ее, когда этот процесс завершается.

В подавляющем большинстве случаев ОС освобождает память - как в случае с обычными «разновидностями» Windows, Linux, Solaris и т. Д. Однако важно отметить, что в специализированных средах, таких как различные Real-Time Операционные системы память не может быть освобождена при завершении программы.

29 голосов
/ 04 июня 2010

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

То, что Windows и все дистрибутивы Linux, которые я когда-либо видел, устраняет утечки памяти.

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


Еще одно соображение при использовании C ++ состоит в том, что если вы не удаляете выделенную кучу памяти, ваши деструкторы также не вызываются. Иногда у вас будут и другие побочные эффекты, если ваши деструкторы не будут вызваны.

12 голосов
/ 04 июня 2010

Работаете ли вы на настольной ОС (Windows, Linux и т. Д.)? Если да, то в общем случае при выходе из программы система освобождает любую память, связанную с программой.

8 голосов
/ 04 июня 2010

Обычно да.Некоторые системы поддерживают такие вещи, как блоки совместно используемой памяти, которые не освобождаются автоматически при выходе из программы.Большинство по-прежнему сохраняют счетчик ссылок и удаляют его, когда все программы, открывшие его, закрываются, но некоторые этого не делают (например, в 16-битной Windows было несколько типов элементов, которые оставались бы выделенными, даже если на них ничего не ссылалось - хотяобычно это происходит по другим причинам до того, как накопится достаточно, чтобы вызвать проблему ...)

2 голосов
/ 04 июня 2010

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

2 голосов
/ 04 июня 2010

Зависит от того, какая память у вас просочилась. Некоторая память не может быть восстановлена ​​ОС. Однако большая часть памяти в большинстве операционных систем будет автоматически освобождена при выходе из процесса.

...