Действительно ли требуется освобождение объекта от выхода программы?
Нужно ли выпускать объекты при выходе/закрытии программ?
Другими словами, скажем, ради аргумента, у вас есть кнопка, которая закрывает ваше приложение, но перед закрытием вы отображаете изображение, а затем закрываете приложение.
Вам нужно отключить это изображение, прежде чем закрыть приложение? Будет ли память автоматически освобождена при выходе из программы, или если вы не отпустите ее, она останется "активной"?
Я понимаю, что вы "должны" выпустить его, мой вопрос о технической стороне и о том, что происходит за кулисами.
Ответы
Ответ 1
Это не нужно. Но если вы используете valgrind
или похожий инструмент, вы скоро обнаружите, что оставив всю вашу память обманутой, вы заглушите ложными предупреждениями.
На стороне Linux, куча вырастает с помощью системного вызова sbrk
. Это увеличивает общее пространство памяти процессора большим блоком за раз (поэтому для обеспечения достаточного пространства для многих malloc
s) требуется только один sbrk
. Когда процесс уходит, ядро восстанавливает всю память, выделенную sbrk
. Вот почему вы в безопасности. Ядро также закроет любые дескрипторы файлов, открытые этим процессом.
Есть несколько проблем, которые могут возникнуть. Если ваш процесс когда-либо fork
в неподходящий момент, все дескрипторы открытых файлов будут дублированы. Я видел, что это проявляется как TCP-соединение, таинственно зависающее после того, как первоначальный процесс умер, что неприятно. Кроме того, есть другие ресурсы, которые просто не связаны с процессом, поэтому они не будут восстановлены, когда процесс погибнет. Это включает сегменты разделяемой памяти, временные файлы, именованные каналы и UNIX-сокеты и, вероятно, множество других механизмов IPC.
В заключение? Память прекрасна. Файловые дескрипторы обычно прекрасны. Некоторые из более эзотерических функций IPC будут ужасно разбиты, если их не очистить.
Ответ 2
На iPhone вам не нужно, и, насколько мне известно, вы не можете. После получения applicationWillTerminate: у вас есть несколько секунд, чтобы сохранить свое состояние, а затем ОС убивает ваш процесс. Создайте одно из примеров приложений и поместите контрольную точку в один из методов dealloc. Они никогда не попадают.
Вот огромный аргумент: текст ссылки
Примечание: Objective C dealloc - это не то же самое, что С++ Deconstructor. В Deconstructor вы можете закрыть файлы, дескрипторы и т.д. В Objective C dealloc предназначен только для освобождения памяти. Вы должны закрыть свои другие ресурсы раньше, так как dealloc никогда не может быть вызван.
Ответ 3
В действительности это не обязательно, но если вы захотите переработать часть своего источника и использовать его в другой программе, вы можете получить утечку памяти. Кроме того, никогда не рассматривайте ОС как без ошибок. Он может "забыть", чтобы освободить некоторые ресурсы.
Ответ 4
Освобождение может помочь вам найти ошибки. Чаще всего проблемы с динамической памятью возникают во время выпуска (например, вы пытаетесь выпустить недопустимый объект). Всегда освобождение может помочь вам определить ошибки, которые в противном случае было бы трудно найти.