FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Duda sobre destrucción de objetos compuestos por otros objetos
Hola, me gustaría saber bien cómo destruir objetos pues aunque si no lo hago el programa funciona sin errores no me gusta ir dejando memoria sin liberar.
Yo usaba siempre Destroy para destruir objetos pero en otro hilo y en este otro de este foro me recomendaron destruir con Free aquellos objetos que no fueran hilos. Hace poco pregunté cómo saber si un objeto estaba creado y ahí me recomendaron usar FreeAndNil(Objeto); para destruir el objeto. Y la duda que tengo es, si tenemos un objeto con varios atributos cuyos tipos son otros objetos, yo tengo dos opciones de destruir: 1) Desde dentro de la clase del objeto:
2) Desde fuera de la clase del objeto (en otra clase que use a la anterior):
En el segundo caso no implemento el método destroy en la clase MiClase y sólo llamo a FreeAndNil desde la clase externa. ¿Qué opción es la correcta? ¿Serían las dos opciones equivalentes? Otra cosa, ¿Delphi no destruye todos los objetos creados al cerrar la aplicación? Saludos. Última edición por noob fecha: 16-02-2009 a las 00:00:09. |
#2
|
||||
|
||||
FreeAndNil lo que hace es llamar al método Free del objeto y luego asignar la variable que apunta hacia él con "nil", después ese método free se encarga de llamar al método destroy. Es por eso que uno no quita del otro, realmente estas usando los dos con FreeAndNil.
Cita:
__________________
"La recompensa de una buena acción está en haberla hecho" Última edición por DarkMan fecha: 15-02-2009 a las 18:19:28. |
#3
|
|||
|
|||
He hecho esto:
Unit1:
Unit2:
Unit3:
y al pulsar el botón el objeto se destruye pero no llama al método Destroy como dices. Última edición por noob fecha: 15-02-2009 a las 23:47:50. |
#4
|
||||
|
||||
Es que me da la impresión de que estas creando mal el objeto.
Aquí:
Estas creando una instancia del objeto pero no asignas su dirección de memoria a ninguna variable. Tendrías que hacer algo como:
En este otro caso:
Estas liberando un objeto que no has creado, por defecto apunta a "nil" así que no hay liberación. De todas formas en una clase que se destruye yo no veo necesario el uso de FreeAndNil, pero no es incorrecto. Pienso que con obj.free valdría.
__________________
"La recompensa de una buena acción está en haberla hecho" |
#5
|
|||
|
|||
Cita:
Pero FreeAndNil sigue sin llamar al método Destroy. Última edición por noob fecha: 15-02-2009 a las 19:05:13. |
#6
|
||||
|
||||
Sí que lo llama, sino te lo crees analicemos el código de cada procedimiento:
FreeAndNil:
llama a Free del objeto que indiques en Obj. Obj.free:
Aquí llama al método destroy del propio objeto. Si te fijas, para que se llame al método destroy existe la condición de que el objeto exista:
Así que en conclusión podemos sacar que fallas también a la hora de crear ese objeto, puede que estés cometiendo el mismo error. Edito: en la unit2 te faltan los inherited dentro del constructor y destructor.
__________________
"La recompensa de una buena acción está en haberla hecho" Última edición por DarkMan fecha: 15-02-2009 a las 19:29:14. |
#7
|
|||
|
|||
Cita:
En el método destructor Destroy de la clase cMiClase he puesto ShowMessage('Objeto destruido'); pero este mensaje no aparece por lo que concluyo que el método Destroy no se llega a ejecutar. Cita:
Saludos. |
#8
|
||||
|
||||
Te hago dos obeservaciones
1. Te falta el override del destructor, tiene que ser asi:
2. Llama al inherited del destructor al final
__________________
[Crandel] |
#9
|
||||
|
||||
Tercera observación , se que lo que pussite es un ejemplo sencillo, pero no es suele ser conveniete crear un objeto en en Create de una clase y destruirlo en un boton.
__________________
[Crandel] |
#10
|
||||
|
||||
Cita:
Saludos. Al González. |
#11
|
|||
|
|||
Cita:
Cita:
Cita:
Saludos. Última edición por noob fecha: 15-02-2009 a las 23:55:08. |
#12
|
||||
|
||||
Cita:
La idea es pedir que cree todo lo que necesita la clase base antes de que cree nuestras cosas; y al destruir, destruimos todas nuestras cosas antes que los elementos propios de la clase base. Cita:
solo lo aclaraba por las dudas. Aclaración del FreeAndNil, como se ve en el código de esta función que publico DarkMan, la unica accion agreda es la de asignar al puntero del objeto el valor nil. Por lo que no tiene sentido llamarlo cuando no es necesario, principalmente en el destroy, simplemente llama al metodo Free. La función esta realmente definida para los casos en los que los objetos se crean dinamicamente y en un determinado momento necesitas diferenciar su estado. Entonces puesdes preguntar
__________________
[Crandel] |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Programacion orientada a Objetos...duda total.... | Kenobi | Varios | 20 | 30-07-2008 16:38:25 |
Objetos de sistema y otros problemas | PaFernan99 | Oracle | 1 | 16-05-2008 00:16:29 |
Duda sobre uso de biblioteca de objetos | romanuel | C++ Builder | 4 | 30-03-2008 05:22:02 |
Accesar a las propiedades de otros objetos | sharky | Varios | 2 | 08-12-2004 00:58:55 |
Destrucción de objetos locales | Aprendiz | OOP | 4 | 04-10-2003 01:02:03 |
|