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

Почему бесплатные ресурсы, если программа уже уходит?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

Ответ 5

Это хорошая идея, чтобы привести в порядок после себя.

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

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

Итак, как только вы управляете ресурсами all так же, как поступаете правильно.

Ответ 10

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

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

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

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

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

Ответ 11

Это хорошие манеры.

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

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

Ответ 12

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

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

Так что не пишите плохое программное обеспечение, которое предполагает, что ОС очистится: он, вероятно, не сделает это на 100%, и этот механизм предназначен только для дерьмового программного обеспечения. Вместо этого напишите хорошее программное обеспечение.

Ответ 13

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

Ответ 14

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

Скажите, если ваш код не освобождает память (даже когда она запускается), и когда ваш размер кода/проекта увеличивается, он будет потреблять всю вашу системную память, и техническое обслуживание будет затруднительно их исправить. Таким образом, для всех будущих целей, это хорошая практика для освобождения памяти.

Ответ 15

Как вы знаете, в зависимости от ОС память обычно (надеюсь, это!) автоматически выпускается, когда процесс завершается.

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

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

Это также хорошая привычка убираться после себя.:)

Ответ 16

Как указывают другие ответы, существует разница между ресурсами и памятью. Я могу говорить только в контексте Win32 api, но я уверен, что подобные концепции применимы для библиотек, таких как SDL. Некоторые библиотеки могут предусматривать автоматическое выделение ресурсов, а некоторые - нет. Это всегда хорошая практика, чтобы освободить ваши ресурсы безотносительно. Ресурсы, специфичные для устройства, являются примером ресурсов, которые могут вызвать проблемы, если они не освобождены. Вы можете ознакомиться с документацией вашей библиотеки для получения подробной информации об управлении ресурсами.

Ответ 17

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

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

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

Ответ 18

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

 1.Heap
 2.Local
 3.Virtual
 4.Global

Локальный, обычно используемый для адресов main(), потому что эти основные переменные будут использоваться часто. Global сохраняет записи глобальных переменных. Память кучи выделена (страницы выделены) программам или процессу и содержит информацию о программных данных и функциях.

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

Чтобы освободить неиспользуемую ячейку памяти, мы используем free(). Поскольку malloc, realloc, calloc, free all являются функциями памяти кучи. Когда мы вызываем бесплатно, удаляем страницы, которые были выделены для программы, а также освобождает эту неиспользуемую память.

  In simple words,

50-100 место памяти, выделенное вашей программе. a и b (переменные в вашей программе) указывают на 60 и 70. из-за некоторой ошибки кода b начинает указывать на 60. Так что теперь a и b оба указывают на 60. Теперь никто не указывает на 70. Когда программа начнет выходить, она получит ячейку памяти и отпустит ее. Затем она получит ячейку памяти b и освободит ее. Но программа никогда не узнает местоположение 70, потому что никто не указывает его. не выпустят память 70.

В то время как, когда u call free(), он сразу освобождает всю страницу, и с этим целым размером памяти 50-100 будет выпущено. Теперь обе места с неосвоенной и заостренной памятью доступны для использования.

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