Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-01-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up Duda sobre el Destructor

Hola amigo,tengo la siguiente duda de como implementar mi destructor en la siguiente clase:
Código Delphi [-]
 TMaquinaria=class(TObject)
 private
  Interno:String;
  Nro_Chasis,Nro_Motor:Integer;
  Modelo:String;
  Tipo,Marca:Integer;
  Fecha_Adq:String;
  De_Alquiler:Boolean;
  Estado:Char;
  Descrip:String;
public
.
.
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:
Código Delphi [-]
destructor TMaquinaria.Destroy;
begin
  inherited;
end;
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:
Código Delphi [-]
constructor TMaquinaria.Create;
begin
inherited;
  Interno:='';
  Nro_Chasis:=-1;
  Nro_Motor:=-1;
  Modelo:='';
  Tipo:=-1;
  Marca:=-1;
  Fecha_Adq:='';
  De_Alquiler:=False;
  Estado:='N';
  Descrip:='';
end;
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
Responder Con Cita
  #2  
Antiguo 07-01-2009
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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é.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 07-01-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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:
Código Delphi [-]
Destructor TMaquinaria.Destroy;
begin
  // lo que deba liberar de memoria
  inherited Destroy;
end;

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 07-01-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Cita:
Es una interesante cuestión.
Si amigo dec, precisamente es por eso mi duda,ya que son tipos de datos primitivos;
La duda surge :Que pasa si los string estan completamente llenos es decir contienen los 255 cracteres ;¿Acaso no estan ocupando memoria?
Cita:
Asi como está definido, no habría necesidad de definir un destructor ya que se trata de atributos simples.
Hola Delphius gracias por responder: En el caso de que no lo implementara el destructor, me gustaria que me expliques entonces como se libera internamente esas variables? Ya que puede ser que algunos o muchos String esten llenos eso implica que por cada strings lleno hay un pedazo de memoria de 256 byte(ocupados); entonces de ahi surgio mi duda.
Espero haberme explicado...
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #5  
Antiguo 07-01-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por rgstuamigo Ver Mensaje
Si amigo dec, precisamente es por eso mi duda,ya que son tipos de datos primitivos;
La duda surge :Que pasa si los string estan completamente llenos es decir contienen los 255 cracteres ;¿Acaso no estan ocupando memoria?

Hola Delphius gracias por responder: En el caso de que no lo implementara el destructor, me gustaria que me expliques entonces como se libera internamente esas variables? Ya que puede ser que algunos o muchos String esten llenos eso implica que por cada strings lleno hay un pedazo de memoria de 256 byte(ocupados); entonces de ahi surgio mi duda.
Espero haberme explicado...
Saludos...
Internamente no se.
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 07-01-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Internamente no se.
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,
Entonces Habria que mirar entonces el metodo FreeInstance para ver que hace.
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
Responder Con Cita
  #7  
Antiguo 07-01-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por rgstuamigo Ver Mensaje
Entonces Habria que mirar entonces el metodo FreeInstance para ver que hace.
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 que 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....
Hola rgstuamigo,
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #8  
Antiguo 07-01-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Hola rgstuamigo,
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,
No amigo no me estoy complicando solo trataba de enteder o por ahi como dicen de meditar, pero bueno no puedo ir contra tu experiencia de programador si tu dices que no hace falta pues listo asi sera,Solo queria entender como se liberaba estos tipos de variables aunque me han quedado ciertas dudas pero bueno;Lo de las caritas no te dejes llevar por dibujitos total a veces queremos poder expresarnos mejor con caritas pero veo que siempre lo toman a mal.
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
Responder Con Cita
  #9  
Antiguo 07-01-2009
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #10  
Antiguo 07-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por rgstuamigo Ver Mensaje
¿Estara mal?o ¿como seria verdaderamente el Destroy?
Tengan en cuenta que al momento de crearlo lo hago asi:
A priori, piensa que todo lo que crees (a := TClase.Create) debes destruirlo.
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.
Responder Con Cita
  #11  
Antiguo 07-01-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
A priori, piensa que todo lo que crees (a := TClase.Create) debes destruirlo.
En tu caso no has creado nada, pues entonces no debes destruir nada (que conste que es una norma general).
Si mas o menos entendi eso Neftali, la duda que tenia era esta:
Cita:
La duda surge :Que pasa si los string estan completamente llenos es decir contienen los 255 caracteres ;¿Acaso no estan ocupando memoria?
Y ademas...
Cita:
En el caso de que no lo implementara el destructor, me gustaria que me expliques entonces como se libera internamente esas variables? Ya que puede ser que algunos o muchos String esten llenos eso implica que por cada strings lleno hay un pedazo de memoria de 256 byte(ocupados); entonces de ahi surgio mi duda.
Espero haberme explicado...
Y para serte franco no entendi muy bien que digamos como se liberan especificamente estos tipos de variables internamente.
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #12  
Antiguo 08-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
Responder Con Cita
  #13  
Antiguo 08-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por rgstuamigo
En el caso de que no lo implementara el destructor, me gustaria que me expliques entonces como se libera internamente esas variables? Ya que puede ser que algunos o muchos String esten llenos eso implica que por cada strings lleno hay un pedazo de memoria de 256 byte(ocupados)
Además de lo que ya te han explicado, creo que no está de más aclararte que un string no es un pedazo de memoria de 256 bytes. En el pascal actual, se distinguen dos tipos de strings: ShortString y long string (que ya mencionó Delphius). Los long strings corresponden al tipo de datos string, mientras que el tipo de datos ShortString corresponde al antiguo string de 256 bytes. También se entiende como short string, a los strings declarados con una longituda máxima:

Código Delphi [-]
var
  S: string[84];

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
Responder Con Cita
  #14  
Antiguo 08-01-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
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.
Ok Neftali eso ya yo lo sabia pues precisamente hace ya mucho tiempo hice algunas puebas pues no en Delphi sino en C++Builder donde puedes definir variables donde tu quieras, pero al parecer en delphi es el mismo concepto y lo que estas hablando es el Procedures y no en Contructores.
Cita:
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.
Ok Roman creo que con eso ya todo fue aclarado.
"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.
Responder Con Cita
  #15  
Antiguo 09-01-2009
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.286
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por rgstuamigo Ver Mensaje
...pero al parecer en delphi es el mismo concepto y lo que estas hablando es el Procedures y no en Contructores.
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 04:26:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi