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 el Destructor
Hola amigo,tengo la siguiente duda de como implementar mi destructor en la siguiente clase:
Esos son mis atributos de mi clase; mi duda es si al momento de destruir estoy dejando alguna fuga de memoria o no estoy destruyendo bien; Lo estoy haciendo de siguiente manera: Bueno practicamente dejo al padre de la clase que lo haga todo; ¿Estara mal?o ¿como seria verdaderamente el Destroy? Tengan en cuenta que al momento de crearlo lo hago asi: Se les agradese de antemano cualquier sugerencia u opinion.
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
|
#2
|
||||
|
||||
Hola,
Es una interesante cuestión. Yo diría que no, que, en el caso que muestras, la clase no contiene a su vez objetos que hubieran de ser liberados. Tiene unas cuantas propiedades, pero, todas son de tipos "simples", por decirlo así. De modo que el "destructor" de tu clase no tiene porqué implementarse. Si lo implementas tal como lo haces, pues bien, pero, como sabes, ahora mismo no haces nada en el destructor (ni yo creo que sea necesario) de modo que es como si no lo implementaras. No sé si estaré equivocado o qué. |
#3
|
||||
|
||||
Hola rgstuamigo,
Asi como está definido, no habría necesidad de definir un destructor ya que se trata de atributos simples. En el caso de que tengas atributos complejos como ser de otras clases, arrays, o cualquier otro tipo que requiera de un manejo explícito de memoria si es necesario definir el destructor para garantizar que se libera la memoria. Por otro lado creo que es mejor, definir el destructor de éste modo:
Saludos, |
#4
|
||||
|
||||
Cita:
La duda surge :Que pasa si los string estan completamente llenos es decir contienen los 255 cracteres ;¿Acaso no estan ocupando memoria? Cita:
Espero haberme explicado... Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
|
#5
|
||||
|
||||
Cita:
Cuando uno envía el mensaje Free, éste llama a Destroy. Luego este destructor invoca de forma automática a FreeInstance. Que es en última instancia el método que libera toda la memoria. Ahora como es que hace el compilador para liberar la memoria no te sabría decir. Tengo entendido que la liberación de memoria del tipo string ocurre de manera transparente al programador, implementando algo como un contador y en base a ese contador lleva el registro de uso de memoria, luego al final se libera. El compilador solito se encarga de liberarla. Si estoy equivocado por favor aclararmelo. Saludos, |
#6
|
||||
|
||||
Cita:
Tengo entendido que Borland invento este truco de poner en la posicion 0 del String, la longitud de la cadena (parece ser que esta en HEXA)es por eso que los String's comienzan en la posicion 1; Entonces si en la posicion 0 del string esta la longitud de el string se me ocurre que podriamos sacar la direccion de Memoria de la variable String y recorrer cuanto caracteres tenga ese string liberando cada char del string, Bueno es una idea no?? quisas es eso hace el compilador, por ahi como tu dices no es necesario. De cualquier forma habria que hacer algunas pruebas No? o quisas alguien nos oriente mejor sobre este asunto. Saludos....
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
|
#7
|
||||
|
||||
Cita:
Me parece que te estás complicando demasiado la vida. ¡El compilador lo hace todo solo! No quisiera malinterpretar esas caritas. ¿Pretendes ser sarcástico? El método FreeInstance es virtual. En la clase base, se llama a CleanupInstance, y luego libera toda la memoria que ocupa. Este CleanupInstance se encarga de liberar todo los variant, strings, (para ser exacto: los longs string) y demás. Saludos, |
#8
|
||||
|
||||
Cita:
Bueno como dicen los españoles: "Muchas gracias por vuestra ayuda". Saludos.....
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
|
#9
|
||||
|
||||
rgstuamigo,
Como programador no llevo mucho tiempo, y faltan muchos más para que aprenda apropiadamente. Con Delphi llevo de 3 o 4 años, como programador con suerte será la mitad. Nomás te digo lo que he leído y aprendido. A lo que preguntas yo lo averigué de dos modos: 1. Viendo el código de dichos métodos. 2. Leyendo la ayuda, en internet, y alguno que otro manual, tutorial y sitio. No es por ser sobrador, ni nada por el estilo, pero he aprendido la lección de que con la ayuda, viendo el código de las clases, y tomándose el tiempo para estudiar bien el tema de POO, patrones, leyendo la Cara Oculta de Delphi, a Zarco, y con lo que se mueve en clubdelphi se puede aprender mucho más y más rápido que irse de cabeza a un código sin investigarle un poquito. Esto te lo digo porque ya me he dado muchos golpes en estos años. Saludos, |
#10
|
||||
|
||||
Cita:
En tu caso no has creado nada, pues entonces no debes destruir nada (que conste que es una norma general).
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#11
|
||||
|
||||
Cita:
Cita:
Cita:
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
|
#12
|
||||
|
||||
Piensa que las variables de los tipos simples (strings, enteros, booleanos,...) que defines, no las creas tu; Es decir nunca llamas a un constructor de un string.
Al definir esas variables, delphi las crea; Todas ellas tienen un "ambito de vida" donde están definidas. Cuando sales de ese ámbito delphi las destruye. Si defines un entero en un procedimiento, cuando entras a ese procedimiento delphi se encarga de asignarle la memoria correspondiente a esa variable en la pila de llamadas (variables locales), al igual que hace con los parámetros o la dirección de retorno. Cuando ese procedimiento finaliza, delphi libera esas posiciones de la pila, liberando la memoria que esas variables ocupaban. En algunos casos las variables no se almacenan directamente en la pila, sino que ahí se guarda el apuntador a memoria donde se encuentra la variable, pero el sistema para liberar es el mismo (con una indirección más).
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#13
|
||||
|
||||
Cita:
Cualquier short string tiene una longitud máxima y desde su declaración, el compilador asigna tanta memoria como indique tal longitud máxima. El tipo de datos string, que corresponde al long string, es un tipo de datos dinámico, más semejante a un apuntador o puntero. De inicio, no se asigna memoria alguna y ésta va creciendo o disminuyendo según se modifique el valor de la variable. El tamaño de un string puede ser de hasta 2GB de memoria, mucho más que los antiguos 256 bytes A diferencia de los punteros, en un string no tenemos que asignar ni liberar memoria explícitamente -el compilador inserta llamadas a funciones que manejan la memoria según se va requiriendo. // Saludos |
#14
|
||||
|
||||
Cita:
Cita:
"En resumen no se debe implementar destructores (EN DELPHI)para clases que tengan todos su atributos con tipos de datos simples o como lo llamo yo : tipos primitivos." Muchas gracias a todos por sus respuestas.... Muchos saludos para todos.....
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Última edición por rgstuamigo fecha: 13-01-2009 a las 21:13:17. |
#15
|
||||
|
||||
La idea sigue siendo la misma, lo que cambia es el "ámbito". En ese caso cuando creas el objeto se crean, cuando se destruye el objeto, se liberan.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
duda sobre dll | romanuel | C++ Builder | 5 | 26-02-2008 20:58:52 |
Duda sobre DFS | enrique_84 | Varios | 2 | 08-06-2006 11:53:40 |
constructor y destructor | gustavo2 | OOP | 11 | 23-04-2004 20:23:20 |
Una duda sobre ADO | PTW | Conexión con bases de datos | 1 | 13-04-2004 23:33:14 |
Sobrecargando destructor | marto | OOP | 4 | 23-01-2004 20:48:25 |
|