Освобождается ли утечка памяти при выходе из программы?

117

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

Мартин Курто
источник
Очень-очень полезный ответ по теме: unix.stackexchange.com/questions/275184/…
Габриэль Стейплс

Ответы:

152

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

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

Джастин Этье
источник
4
Вопрос: отслеживает ли ОС все распределения? Любая выделяемая вами кучная память поступает из пространства виртуальной памяти процесса - когда процесс завершается, это пространство возвращается всей системе, верно? Я не понимаю, зачем нужна дополнительная бухгалтерия, поскольку процесс распределения - единственный процесс (в пользовательском пространстве), в любом случае имеющий доступ к этим страницам. Или меня неправильно научили?
Крис Тонкинсон
6
@Justin: Не зная ОС, я не думаю, что это действительно так. Возможно, явно укажите ОС, о которой вы говорите.
Брайан Р. Бонди
1
Примечание: в стандарте об этом ничего не говорится. Это тоже не гарантируется. Именно так это работает на большинстве, если не на всех современных ОС, но они не обязаны это делать, и в прошлом были такие, которые были обычными и не производили такой очистки.
Эдвард Стрэндж
5
Существуют различные ОС реального времени для небольших устройств и т.п., которые не восстанавливают память, потерянную в результате утечек. Ваш вопрос зависит от ОС, о которой вы говорите.
Брайан Нил,
14
Даже в определенных операционных системах, защищенных памятью, вам все равно необходимо определить «утечку». Приложения могут выделять «системные» ресурсы за пределами своего собственного пространства памяти (дескрипторы часто используются для их идентификации в мире Windows). Закрытие приложения не всегда гарантирует высвобождение этих типов ресурсов.
Дэвид
34

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

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

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


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

Брайан Р. Бонди
источник
14

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

Vicky
источник
10

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

Джерри Гроб
источник
5

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

равибхагв
источник
4

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

Щенок
источник
6
Некоторая память не может быть освобождена ОС - например, что?
2
В некоторых ОС реального времени я видел специальные блоки буфера Ethernet, которые не очищаются при выходе из процесса.
Брайан Нил,
1
Общая память также обычно не восстанавливается, потому что вы можете захотеть, чтобы она сохранялась для использования переходными процессами.
Брайан Нил,