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

Как далеко может протекать память?

Я много раз сталкивался с утечками памяти. Обычно, когда я malloc, как там нет завтра, или болтаться FILE *, как грязное белье. Обычно я предполагаю (читайте: надеюсь отчаянно), что вся память очищается, по крайней мере, когда программа завершается. Существуют ли ситуации, когда утечка памяти не собирается, когда программа завершается или сбой?

Если ответ сильно варьируется от языка к языку, тогда пусть сосредоточится на C (++).

Обратите внимание на гиперболическое использование фразы: "как нет завтра", и "болтаться... как грязное белье". Небезопасно * malloc * ing может повредить любимым. Также, пожалуйста, будьте осторожны с грязным бельем.

4b9b3361

Ответ 1

Нет. Операционные системы освобождают все ресурсы, удерживаемые процессами при их выходе.

Это относится ко всем ресурсам, которые поддерживает операционная система: память, открытые файлы, сетевые подключения, дескрипторы окон...

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

Операционная система может занять много времени, чтобы освободить определенные ресурсы. Например, TCP-порт, используемый сетевым сервером для приема соединений, может занять несколько минут, чтобы стать свободным, даже если он был правильно закрыт программой. Сетевая программа может также содержать удаленные ресурсы, такие как объекты базы данных. Удаленная система должна освобождать эти ресурсы, когда сетевое соединение будет потеряно, но оно может занять больше времени, чем локальная операционная система.

Ответ 2

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

Ответ 3

Поскольку все ответы затронули большинство аспектов вашего вопроса w.r.t. современные ОС, но исторически, есть один, который стоит упомянуть, если вы когда-либо программировали в мире DOS. Программы Terminator и Stay Resident (TSR) обычно возвращают управление системе, но будут находиться в памяти, которая может быть восстановлена ​​программным/аппаратным прерыванием. Было нормально видеть сообщения, подобные "из памяти! Попробуйте разгрузить некоторые из ваших TSR" при работе с этими ОС.

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

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

Я помню еще один пример. Система управления информацией клиентов (CICS), сервер транзакций, который работает в основном на мэйнфреймах IBM, является псевдодиалоговым. При выполнении он обрабатывает введенные пользователем данные, генерирует другой набор данных для пользователя, перенося на пользовательский терминал node и заканчивая. При активации ключа внимания он снова восстанавливает процесс обработки другого набора данных. Поскольку так, как он себя ведет, технически снова, ОС не будет возвращать память из завершенных программ CICS, если вы не переработаете сервер транзакций CICS.

Ответ 4

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

Сказав это, память может быть не единственной вещью, о которой вам нужно беспокоиться при работе с новым/удаленным (вместо raw malloc/free). Память, которая выделяется в новой, может быть исправлена, но вещи, которые могут быть выполнены в деструкторах объектов, не будут выполняться. Возможно, деструктор какого-либо класса записывает дозорное значение в файл при уничтожении. Если процесс просто завершается, дескриптор файла может быть сброшен, а память восстановлена, но это контрольное значение не будет записано.

Мораль истории, всегда очищайте себя. Не позволяйте вещам болтаться. Не полагайтесь на очистку ОС после вас. Очиститесь после себя.

Ответ 5

Это скорее зависит от операционной системы, чем от языка. В конечном итоге любая программа на любом языке получит ее память из операционной системы.

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

Ответ 6

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

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

В технических терминах, если ваши утечки имеют "сложность" памяти O (1), в большинстве случаев они прекрасны, O (logn) уже неприятный (а в некоторых случаях и фатальный) и O (N) + невыносимый.

Ответ 7

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

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

Одна программа, над которой я работал, для выполнения программы потребовался 30 секунд или более, чтобы программа выходила из нее, потому что она возвращалась по графику всей динамической памяти и отпускала ее по частям.

Разумное решение состоит в том, чтобы иметь возможность там и покрывать его тестовыми примерами, но отключать его в производственном коде, чтобы приложение быстро закрывалось.

Ответ 8

Общая память в системах, совместимых с POSIX, сохраняется до тех пор, пока не вызывается shm_unlink или система не перезагружается.

Ответ 9

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

Чтобы привести пример, я когда-то экспериментировал с печатью на PDF-принтере в Java, когда я закончил JVM в середине задания на принтер, процесс буферизации PDF оставался активным, и мне пришлось убить его в диспетчере задач прежде чем я смогу повторить печать.