Чи звільняється просочена пам'ять, коли програма закінчується?


Відповіді:


151

Так, "витік пам'яті" - це просто пам'ять, на яку процес більше не має посилання, і тому більше не може бути вільним. ОС все ще відслідковує всю пам'ять, виділену процесу, і звільнить його, коли цей процес припиниться.

У переважній більшості випадків ОС звільнить пам'ять - як у випадку з нормальними "ароматами" Windows, Linux, Solaris тощо. Однак важливо зазначити, що в спеціалізованих середовищах, таких як різні операційні системи в режимі реального часу, пам'ять може не звільнятися, коли програма припиняється.


4
Запитання: чи відслідковує ОС всі розподіли? Будь-яка куча пам'яті, яку ви виділяєте, походить з віртуального простору пам'яті процесу - коли процес закінчується, цей простір повертається до системи оптом, правда? Я не розумію, для чого потрібна буде додаткова бухгалтерія, оскільки процес здійснення асигнувань - це єдиний процес (в країні користувачів), який так чи інакше має доступ до цих сторінок. Або мене неправильно навчали?
Кріс Тонкінсон

6
@Justin: Не знаючи ОС, я не думаю, що це дійсно. Можливо, чітко вкажіть ОС, про яку ви говорите.
Брайан Р. Бонді

1
Примітка: стандарт нічого про це не говорить. Це також не гарантується. Це так, як це працює в більшості, якщо не в усіх сучасних ОС, але вони не повинні, і в минулому були такі, які були звичайними і не робили цього очищення.
Едвард Странд

5
Існують різні ОС в режимі реального часу для невеликих пристроїв тощо, які не повертають пам'ять, втрачену під час витоку. Ваше питання залежить від ОС, про яку ви говорите.
Брайан Ніл

14
Навіть із конкретними захищеними пам'яттю операційними системами все одно потрібно визначити "протікання". Програми дуже можливо виділити "системні" ресурси за межами власного простору пам'яті (ручки часто використовуються для їх ідентифікації у світі Windows). Закриття програми не завжди забезпечує звільнення цих типів ресурсів.
Девід

34

ОС, що виконує вашу програму, зазвичай робить пам'ять очищення, яка не звільнена явно, і обробляє, які не закриваються явно, але це не гарантується стандартом C ++. Ви можете знайти якийсь вбудований пристрій, який не звільняє протікання пам'яті.

При цьому Windows і всі дистрибутиви Linux, які я коли-небудь бачив, звільняють витоки пам'яті.

Ви можете легко створити величезний цикл витоку пам'яті, хоча протестувати його самостійно. Спостерігайте за тим, як зростає використання оперативної пам’яті, а потім закрийте програму. Ви побачите, що використання оперативної пам'яті знижується.


Ще одне врахування при використанні C ++ полягає в тому, що якщо ви не видаляєте пам'ять, виділену купу, то ваші деструктори також не будуть викликані. Іноді у вас з’являться й інші побічні ефекти, якщо ваші деструктори не будуть викликані.


14

Ви працюєте на настільній ОС (Windows, Linux тощо)? Якщо так, так, загалом система звільнить будь-яку пам'ять, пов’язану з програмою, коли програма закінчується.


10

Зазвичай, так. Деякі системи підтримують такі речі, як блоки спільної пам’яті, які автоматично не звільняються, коли програма виходить. Більшість як і раніше зберігає кількість посилань і видаляє її, коли всі програми, що відкрили її, виходять, але деякі не мають (наприклад, у 16-бітної Windows було кілька типів елементів, які залишатимуться виділеними, навіть коли нічого до них не згадувалося - хоча Зазвичай він випадає з інших причин, перш ніж достатньо цього накопичилося, щоб викликати проблему ...)


5

Наскільки мені відомо, сучасна операційна система звільнить цю пам’ять, коли програма закінчиться.


4

Залежить від того, яку пам’ять ви просочилися. Деяка пам'ять не може бути відновлена ​​ОС. Однак більша частина пам'яті на більшості ОС буде автоматично відтворена, коли процес завершиться.


6
Деяка пам'ять не може бути відновлена ​​ОС - наприклад, що?

2
У деяких ОС в режимі реального часу я бачив спеціальні блоки Ethernet-буфера, які не очищаються, коли процес закінчується.
Брайан Ніл

1
Спільна пам'ять також зазвичай не відновлюється, тому що, можливо, ви хочете, щоб вона зберігалася для перехідних процесів.
Брайан Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.