Действительно ли требуется освобождение объекта при выходе из программы? - PullRequest
14 голосов
/ 07 декабря 2008

Требуется ли освобождение объектов при выходе / закрытии программ?

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

Вам нужно отключить это изображение, прежде чем закрыть приложение? Будет ли память автоматически освобождена при выходе из программы, или если вы не отпустите ее, будет ли память оставаться «активной»?

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

Ответы [ 4 ]

27 голосов
/ 07 декабря 2008

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

Что касается Linux, то куча увеличивается с помощью системного вызова sbrk. Это увеличивает общее пространство памяти процессора на большой блок за раз (поэтому для обеспечения достаточного пространства для многих malloc с необходим только один sbrk). Когда процесс завершается, ядро ​​освобождает всю память, выделенную sbrk. Вот почему вы в безопасности. Ядро также закроет все файловые дескрипторы, открытые этим одним процессом.

Есть несколько проблем, которые могут возникнуть. Если ваш процесс когда-либо fork с в неподходящий момент, любые дескрипторы открытого файла будут продублированы. Я видел этот манифест в виде TCP-соединения, загадочно зависшего заживо после смерти оригинального процесса, что является противным Кроме того, существуют другие ресурсы, которые просто не ограничены областью действия процесса, поэтому они не будут возвращены после завершения процесса. Сюда входят сегменты разделяемой памяти, временные файлы, именованные каналы и сокеты UNIX и, возможно, множество других механизмов IPC.

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

4 голосов
/ 07 декабря 2008

На iPhone вам не нужно, и, насколько я знаю, вы не можете. После получения applicationWillTerminate: у вас есть несколько секунд для сохранения вашего состояния, а затем ОС убивает ваш процесс. Создайте одно из примеров приложений и установите точку останова в одном из методов dealloc. Их никогда не бьют.

Вот огромный аргумент по этому поводу: текст ссылки

Примечание: Objective C dealloc не то же самое, что деконструктор C ++. В Deconstructor вы можете закрывать файлы, дескрипторы и т. Д. В Objective C Deloc - только для освобождения памяти. Вы должны закрыть свои другие ресурсы раньше, так как dealloc может никогда не позвонить.

1 голос
/ 07 декабря 2008

Действительно, в этом нет необходимости, но если вы захотите перезапустить какой-либо источник и использовать его в другой программе, вы можете получить утечки памяти. Кроме того, никогда не считайте, что ОС безошибочна. Можно было бы «забыть» освободить некоторые ресурсы.

0 голосов
/ 14 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...