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

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

Ответы [ 18 ]

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

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

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

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

2 голосов
/ 04 декабря 2011

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

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

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

1 голос
/ 04 декабря 2011

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

0 голосов
/ 05 декабря 2011

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

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

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

0 голосов
/ 04 декабря 2011

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

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

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

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

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

  In simple words,

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

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

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

0 голосов
/ 04 декабря 2011

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

0 голосов
/ 03 декабря 2011

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

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

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

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

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

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

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

...