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

Утечка памяти приложения вызывает утечку памяти операционной системы?

Когда мы говорим, что программа утечки памяти, скажем new без удаления в С++, действительно ли она протекает? Я имею в виду, когда программа заканчивается, является ли эта память еще выделенной для какой-то нерабочей программы и не может быть использована, или же ОС знает, какая память была запрошена каждой программой, и отпустите ее, когда закончится программа? Если я запустил эту программу много раз, у меня не хватит памяти?

4b9b3361

Ответ 1

В операционных системах с защищенной памятью (Mac OS 10+, все Unix-клоны, такие как Linux и NT-системы Windows, что означает Windows 2000 и младше), память освобождается при завершении программы.

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

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

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

Ответ 2

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

Ответ 3

Загрязненная память возвращается ОС после завершения выполнения.

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

Давайте рассмотрим следующий сценарий:

  • Программа A запрашивает память из ОС
  • OS отмечает блок X, используемый A и возвращает его в программу.
  • Программа должна иметь указатель на X.
  • Программа возвращает память.
  • ОС маркирует блок как бесплатный. Использование блока теперь приводит к нарушению доступа.
  • Программа A заканчивается, и вся память, используемая A, отмечена как неиспользуемая.

В этом нет ничего плохого.

Но если память выделяется в цикле, и удаление забывается, вы сталкиваетесь с реальными проблемами:

  • Программа A запрашивает память из ОС
  • OS отмечает блок X, используемый A и возвращает его в программу.
  • Программа должна иметь указатель на X.
  • Перейти к 1

Если в ОС не хватает памяти, программа, вероятно, сработает.

Ответ 4

Нет. Как только ОС заканчивает закрытие программы, память возвращается (с учетом разумно современной ОС). Проблема заключается в длительных процессах.

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

Термин "утечка" относится к тому, что с течением времени потребление памяти будет расти без какой-либо дополнительной выгоды. "Просочившаяся" память - это память, не используемая программой и не используемая ОС (и другими программами).

Унылые утечки памяти очень распространены в неуправляемом коде. У меня был firefox, работающий в течение пары дней, а использование памяти - 424 МБ, хотя только 4 вкладки открыты. Если бы я закрыл firefox и повторно открыл те же самые значения памяти памяти, вероятно, будет < 100MB. Таким образом, 300+ МБ "просочились".