Вызывает ли утечка памяти в приложении утечку памяти в операционной системе? - PullRequest
27 голосов
/ 11 ноября 2010

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

Ответы [ 9 ]

36 голосов
/ 11 ноября 2010

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

19 голосов
/ 11 ноября 2010

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

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

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

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

14 голосов
/ 11 ноября 2010

Утечка памяти возвращается ОС после остановки выполнения.

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

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

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

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

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

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

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

5 голосов
/ 11 ноября 2010

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

3 голосов
/ 11 ноября 2010

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

3 голосов
/ 11 ноября 2010

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

2 голосов
/ 11 ноября 2010

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

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

2 голосов
/ 11 ноября 2010

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

1 голос
/ 14 ноября 2010

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

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

К сожалению, утечки памяти очень распространены в неуправляемом коде.У меня Firefox работает уже пару дней, а использование памяти составляет 424 МБ, несмотря на то, что открыто только 4 вкладки.Если бы я закрыл Firefox и снова открыл те же вкладки, использование памяти, вероятно, было бы <100MB.Таким образом, 300+ МБ «просочились». </p>

...