Me gustaría saber POR QUÉ usamos "Finalización" si queremos destruir algo al cerrar la aplicación? no cerrar la aplicación libera todos los objetos directamente sin llamar a .Free?¿Por qué usamos la Finalización en Unidades?
Gracias.
Me gustaría saber POR QUÉ usamos "Finalización" si queremos destruir algo al cerrar la aplicación? no cerrar la aplicación libera todos los objetos directamente sin llamar a .Free?¿Por qué usamos la Finalización en Unidades?
Gracias.
¿El cierre de la aplicación libera todos los objetos directamente sin llamar al
Free
?
No. Las instancias de la clase Delphi no son basura, por lo que deben destruirse manualmente.
Sin embargo, si usted está hablando de un proceso ejecutable, entonces puede ser perfectamente aceptable de no disponer de ciertos objetos ya que el sistema operativo se volverá a demanda todos los recursos propiedad de un proceso cuando el proceso termina. Entonces, aunque los destructores Delphi no se ejecutan, el sistema operativo lo ordena todo cuando termina un proceso. No es posible que un proceso escape ningún recurso del sistema una vez que haya finalizado.
Tenga en cuenta que si la unidad está incluida en un archivo DLL o en un paquete, la falla al destruir todos los objetos en el momento de finalización generará fugas de memoria, si esa DLL se carga y descarga repetidamente en un único proceso.
Si sabe que su código solo se ejecuta en un ejecutable, entonces siéntase en libertad de no Free
objetos en el momento de finalización. Tenga en cuenta que si está utilizando una herramienta de detección de fuga de memoria, al hacerlo, su objeto filtrado intencionalmente se tratará como una pérdida de memoria. Trate con eso llamando al RegisterExpectedMemoryLeak
.
Un último punto a destacar es que el destructor de un objeto a veces hace más que liberar memoria. A veces puede guardar valores en un archivo de configuración, o en el registro, por ejemplo. Naturalmente, no querrá omitir ejecutar el destructor para tal objeto.
¿Qué sucede cuando cerramos la aplicación? ¿solo libera la aplicación en sí y nada más? – user1512094
No sé a qué te refieres con esa pregunta. –
¡no es necesario leerlo! su descripción anterior es suficiente y perfecta ... ¡muchas gracias! : D – user1512094
Agregando al punto final de la respuesta de David Hefferman: hay otros recursos que pueden necesitar liberarse correctamente, como manejadores de archivos que generan una suma de comprobación o algún hardware conectado a la PC que debe ponerse en un estado específico (ej. un láser para ser apagado, que es con lo que estoy trabajando actualmente).
Evite utilizar las secciones de Inicialización/Finalización en unidades. Vienen de la antigua Turbo Pascal. Cree, inicie y libere objetos explícitamente cuando lo necesite. – Marcodor
@Marcodor Si realmente tiene un objeto verdaderamente global como un singleton, entonces la inicialización/finalización de la unidad es apropiada –
La inicialización se ejecuta antes de que se creen formularios: este es un lugar ideal para crear recursos de los que dependerán múltiples formularios y, aún más importante , recursos que deben sobrevivir a todas las instancias de formularios y, de hecho, sobrevivir a toda la aplicación Delphi. Las secciones de finalización todavía son ocasionalmente útiles también. –