Действительно ли требуется освобождение объекта от выхода программы?

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

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

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

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

Ответы

Ответ 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

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