Динамически выделяемая память после завершения программы

Когда программа на C/C++, содержащая динамически распределенную память (использующую malloc/new) без вызовов free/delete, завершается, что происходит с этой динамически распределенной памятью? Операционная система забирает память или эта память становится недоступной для других программ?

5 ответов

Решение

Я не думаю, что есть какие-либо гарантии в языковом стандарте, но современные операционные системы, которые поддерживают разреженную виртуальную память и защиту памяти (такие как MacOS X, Linux, все последние версии Windows и все производимые в настоящее время телефонные трубки), автоматически очищаются после процессов с плохим поведением (когда они завершаются) и освободить память для вас. Память остается недоступной, однако, пока программа работает.

Если вы программируете на микроконтроллерах, на MacOS 9 или более ранних версиях, DOS или Windows 3.x, вам может потребоваться утечка памяти, делающая память постоянно недоступной для всей операционной системы.

Большинство современных операционных систем используют диспетчер памяти, и все пользовательские процессы видят только так называемую виртуальную память, которая не связана с реальной системной памятью так, как программа могла бы ее проверить. Это означает, что программы не могут просто читать память другого процесса или память ядра. Это также означает, что диспетчер памяти полностью "освободит" всю память, которая была назначена процессу, когда этот процесс завершится, так что утечки памяти в программе обычно не "влияют" на остальную систему (кроме, возможно, принудительного огромное количество подкачки диска и, возможно, поведение "нехватки памяти").

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

Краткий ответ: да, ОС освободит эту память.

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

C/C++ не имеет функции сбора мусора. Если вы выделяете память и не освобождаете ее, она бесполезна, пока продолжается выполнение программы. Это называется утечка памяти. По завершении выполнения ОС забирает эту память и снова становится доступной для использования.

Во время выполнения программы вы не можете рассчитывать на то, что операционная система восстанавливает память. Это была бы функция сбора мусора, найденная во многих других языках, таких как Java и C#. Хотя сборка мусора в C++ возможна, я не верю, что какие-либо основные реализации используют ее.

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

Другие вопросы по тегам