динамически распределяемая память после завершения программы - PullRequest
21 голосов
/ 18 июля 2011

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

Ответы [ 5 ]

33 голосов
/ 18 июля 2011

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

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

8 голосов
/ 18 июля 2011

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

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

5 голосов
/ 18 июля 2011

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

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

2 голосов
/ 18 июля 2011

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

1 голос
/ 18 июля 2011

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

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

...