Зачем бесплатно ресурсы, если программа уже выходит? - PullRequest
26 голосов
/ 25 ноября 2011

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

Ответы [ 18 ]

25 голосов
/ 25 ноября 2011

Память и ресурсы не одно и то же.

Память освобождается автоматически.

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

21 голосов
/ 25 ноября 2011

Даже если ваша ОС (не все так делают) освобождает память при выходе, есть несколько причин:

  • это хорошо
  • добавляет симметрию, поэтому код выглядит лучше
  • ОС не автоматически освобождает некоторые ресурсы при выходе, например устройства (датчики, сканеры ...)
  • , если кто-то берет этот код и помещает его в программу, которая использует библиотеки только в небольшихчасть его времени выполнения, ресурсы будут свободны, когда они не нужны.
  • , если вы ищете плохие утечки памяти, ваш отладчик не найдет эти неважные.*
8 голосов
/ 25 ноября 2011

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

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

5 голосов
/ 25 ноября 2011

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

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

Основная идея заключается в том, что если программное обеспечение не должно уничтожать пользовательские данные и т. Д. В случае сбоя (подумайте о базах данных / журналах передачи и т. Д.), Зачем вам даже проектировать / программировать чистый путь выхода. Если вам нужно перезапустить, перезапустить его, вы также можете «дать сбой».

Ну, я думаю, о достоинствах этого можно спорить весь день, но, тем не менее, это интересно.

4 голосов
/ 25 ноября 2011

Хорошо бы привести себя в порядок.

Для одного - освобождение ресурсов будет приводить в порядок описатели файлов / сетевые подключения / разделяемую память и т. Д. Контролируемым образом.

Во-вторых, если вы используете что-то вроде purity, вы можете убедиться, что вся память учтена, что дает лучшее ощущение отсутствия утечек памяти.

4 голосов
/ 02 декабря 2011

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

Ни одна из этих структур (в большинстве операционных систем) не очищается автоматически при закрытии приложения:

  • Пулы общей памяти
  • Именованный Win32 Mutex / Семафор / Событие / и т. Д. объекты
  • Некоторые виды сокетных соединений
  • Структуры данных проприетарного драйвера устройства (неясны)

... и я уверен, что забыл некоторые.

В небольшом количестве может быть легко узнать, использует ли ваше приложение какой-либо из этих типов объектов и управляет им. Однако в более крупных приложениях нетрудно добраться до точки, где у вас есть какая-то глубоко внедренная (сторонняя?) Подсистема, которая выделяет одну или несколько из этих специальных структур, и если остальная часть вашего приложения протекает как сито, Вы можете быть в беде.

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

3 голосов
/ 25 ноября 2011

Одна причина, которую я вижу, это:

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

3 голосов
/ 01 декабря 2011

Прежде всего: ОС не освобождает все ресурсы после завершения процесса, например:

  1. Файлы - иногда вы можете удалить файлы, которые вы открыли.
  2. Именованные ресурсы: именованные мьютексы, разделяемая память и т. Д. И т. Д.
  3. Более сложные настройки состояний приложений, статистика и многое другое.

Так что, как только вы справитесь all ресурсы так же, как вы делаете правильные вещи.

3 голосов
/ 25 ноября 2011

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

Исторически операционные системы вообще не беспокоились (особенно некоторые из более старых 16-битных операционных систем), поэтому очистка всех ваших ресурсов после завершения программирования стала и остается хорошей практикой программирования, и программист, не убирающий свои вещи,как правило, считается плохим программистом.

3 голосов
/ 02 декабря 2011

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

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

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

  • при тестировании встроенного приложения на обычном ПК мы вынужденымоделировать моделируемое устройство как процесс, который начинается и заканчивается.Если бы ресурсы были высвобождены должным образом, мы могли бы запустить один процесс несколькими тестами одновременно, включая тесты, запускающие и останавливающие моделируемое устройство.
  • В какой-то момент нам пришлось работать над проектом, который требовал от нас выполнениячасть встроенного кода и опубликовать его в виде библиотеки динамических ссылок для Windows / Linux, которая выполняет подмножество функций реального устройства, но без реального устройства.Из-за проблемы с ресурсами пользователи не могут загружать и выгружать эту DLL несколько раз в свои приложения, потому что каждый раз, когда они это делают, приличный кусок памяти отбирается и никогда не возвращается.Мы задокументировали это как ограничение, мы просим наших пользователей связывать библиотеку с приложением, а не загружать ее динамически.К сожалению, через 10 с лишним лет, когда это встроенное устройство находилось в разработке, было бы очень сложно найти и исправить все эти распределения ресурсов, поэтому мы продолжаем откладывать его и вместо этого имеем неоптимальный продукт.
  • , когда мыиспользуя инструменты статического и динамического анализа кода, чтобы обнаружить реальные дефекты, мы получаем массу ложных срабатываний, поэтому нам пришлось разработать инструменты, которые отфильтровывают их, чтобы не рисковать, пропуская реальные ошибки во всем шуме.

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

...