2008-12-07 10 views
14

Tengo una pregunta técnica. Esto NO es una pregunta sobre la codificación correcta.¿Se necesita realmente la liberación de objetos en la salida del programa?

Mi pregunta es técnicamente es la liberación de los objetos de una salida de programas/cierre necesaria?

En otras palabras, digamos que por el bien de la discusión, que tiene un botón que cierra su aplicación, pero justo antes de cerrar se visualiza una imagen, y después de cerrar la aplicación.

¿Te TÉCNICO necesidad de liberar ese punto de vista de la imagen antes de cerrar la aplicación? ¿La memoria se liberará automáticamente cuando el programa salga, o si no la suelta, la memoria se mantendrá de alguna manera "activa"?

entiendo que "debe" liberarlo, mi pregunta es sobre el aspecto técnico de la misma, y ​​lo que sucede detrás de las escenas.

Gracias.

Respuesta

26

No es necesario. Pero si está usando valgrind o una herramienta similar, pronto descubrirá que dejar toda su memoria colgando los pantanos con advertencias falsas.

En el lado de las cosas Linux, el montón se cultiva usando la llamada sbrk sistema. Esto aumenta el espacio total de la memoria del procesador en un bloque grande a la vez (por lo que solo se necesita un sbrk para proporcionar suficiente espacio para muchos malloc s). Cuando el proceso desaparece, el kernel recupera toda la memoria asignada por sbrk. Es por eso que estás a salvo. El kernel también cerrará cualquier descriptor de archivo abierto por ese único proceso.

Hay algunos problemas que pueden surgir. Si su proceso alguna vez fork s en un momento inoportuno, cualquier descriptor de archivo abierto será duplicado. He visto esto manifestarse como una conexión TCP misteriosamente colgando con vida después de que el proceso original murió, que es desagradable. Además, hay otros recursos que simplemente no tienen un alcance de proceso, por lo que no se recuperarán cuando el proceso fallezca. Esto incluye segmentos de memoria compartida, archivos temporales, canalizaciones con nombre y sockets de UNIX, y probablemente una gran cantidad de otros mecanismos de IPC.

¿En resumen? La memoria está bien. Los descriptores de archivos generalmente están bien. Algunas de las funciones más esotéricas del IPC se romperán horriblemente si no se limpian.

1

De hecho, no es necesario, pero si desea reciclar parte de su fuente y utilizarla en otro programa, es posible que tenga pérdidas de memoria. Además, nunca considere que el SO sea sin ningún defecto. Podría "olvidarse" de liberar algunos recursos.

4

En el iPhone, que no es necesario, y por lo que yo sé, no se puede. Después de recibir applicationWillTerminate: tiene unos segundos para guardar su estado y luego el sistema operativo mata su proceso. Cree una de las aplicaciones de muestra y ponga un punto de interrupción en uno de los métodos dealloc. Nunca reciben un golpe.

Aquí hay una gran discusión al respecto: link text

Nota: Objetivo dealloc C no es la misma cosa que un C++ Deconstructor. En un Deconstructor puede cerrar archivos, identificadores, etc. En Objective C dealloc es solo para liberar memoria. Debe cerrar sus otros recursos antes, ya que dealloc nunca podrá ser llamado.

0

La liberación puede ayudarlo a encontrar errores. En la mayoría de los casos, los problemas de memoria dinámica se activan en el momento de la liberación (por ejemplo, intenta liberar un objeto no válido).Siempre liberar puede ayudarlo a identificar errores que de otra manera serían difíciles de encontrar.

Cuestiones relacionadas