Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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