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 05-10-2005
OscarG OscarG is offline
Miembro
 
Registrado: sep 2005
Posts: 35
Poder: 0
OscarG Va por buen camino
liberar objetos

Bueno, por mi parte como programador de seudo videojuegos (no hago quakes ni na parecido jeje) uno de mis miedos el liberar la memoria, ya sea de punteros y objetos...

Algunas cosas he leido sobre cómo liberar los objetos pero a veces tengo problemas q no encuentro solución.

Un ejemplo era con la clase TServerSocket q lo utilicé hace tiempo para un juego en red.

El problema era q a la hora de liberar dicho objeto, me daba error, no me dejaba hacer un .Free por lo q opté por la decisión de no liberarlo.

Supongo q si aprendo a liberar un TServerSocket, con otros problemas q me tope, tendré más oportunidades de solucionarlo.

En todo caso por lo q sé...todo objeto se libera con Free y yo lo suelo poner luego a nil porsiaca...
Responder Con Cita
  #2  
Antiguo 05-10-2005
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.293
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 OscarG
...todo objeto se libera con Free y yo lo suelo poner luego a nil porsiaca...
Para eso te puede ser últi el procedimiento FreeAndNil (SysUtils en D6).
Creo que es obvio lo que hace...
__________________
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
  #3  
Antiguo 05-10-2005
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Poder: 0
lento manu Va por buen camino
Ejecutar o indultar

Por lo que voy entendiendo, creo que solo hay que liberar los objetos que creamos espeficicamente. Quiero decir que si usamos objetos que hemos añadido al private o al public y no presisan de un TmiObjeto.create, por mi experiencia, creo que es mejor el indulto, pero todos los que has generado con algún .create deben pasar por las manos del verdugo.
Lo que no se es porque algunos objetos existen por si mismos y otros no, no se si es por su componente visual, o sea si debe ser pintado o no... ¿alguén los sabe? o ¿estoy metiendo la pata hasta el fondo?
Con respecto al
Código Delphi [-]
 if Assigned(miobjeto) 
    then FreeAndNil(miobjeto);
a veces me explota ya en if Assigned pq ya no existe. ¿Ilógico no?
Responder Con Cita
  #4  
Antiguo 05-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por lento manu
Lo que no se es porque algunos objetos existen por si mismos y otros no, no se si es por su componente visual, o sea si debe ser pintado o no... ¿alguén los sabe? o ¿estoy metiendo la pata hasta el fondo?
Al crear un objeto Pepe:TObject tienes que especificar el dueño (parámetro AOwner), si le pones nil a ese parámetro, tienes que hacer un FreeAndNil(Pepe) obligatoriamente. Si en AOwner le das: Application, Form1, panel1, cuando se vaya a destruir ese objeto, él se encargará de liberar a Pepe.
Cita:
Empezado por lento manu
Con respecto al
Código Delphi [-]
 if Assigned(miobjeto) 
    then FreeAndNil(miobjeto);
a veces me explota ya en if Assigned pq ya no existe. ¿Ilógico no?
[/quote]
Si miobjeto está declarado dentro de Form1, y has liberado Form1, entonces si da el error.

Assigned solo comprueba que el valor de esa variable contiene el valor "nil" o bien una dirección de memoria. Recuerda que todos los objetos son, en realidad, punteros de memoria. Assigned solo comprueba el valor que tiene ese puntero. No el objeto en sí.

De hecho, cuando haces un Pepe.Free, el puntero Pepe no apunta a nil, se queda con basura y pueden venir Access violation al intentar acceder a pepe.

Saludando, dejo tranquilo a Pepe

Última edición por Lepe fecha: 05-10-2005 a las 20:19:51.
Responder Con Cita
  #5  
Antiguo 06-10-2005
OscarG OscarG is offline
Miembro
 
Registrado: sep 2005
Posts: 35
Poder: 0
OscarG Va por buen camino
Bueno, conozco el FreeAndNil, pero no lo suelo usar...manias...

Lo q quiero decir con crear, viendo lo comentado y según me acuerdo, (es un programa q hice hace 1 año) es q yo creaba un cliente y un servidor.

TServerSocket
TClientSocket

El procedimiento para cada uno era tener una clase por cada y dentro de ella declarar un servidor o un cliente y q esa clase le controle su comportamiento...

Entonces, a estos les pasaba al crearlos el TComponent del formulario.

Entonces al destruir la clase q contenía el TServerSocket no me dejaba hacer un FreeAndNil del objeto, en cambio, con el TClientSocket si me dejaba...

Creo recordar q me comí un poco la cabeza probando formas diferentes para q no cascase, pero al final opté por q lo libere la aplicación al destruirse, ya q dependía del formulario principal...

Este caso, me mosqueo, xq me parecía q hacia todo bien

Código Delphi [-]
SSocket:= TServerSocket.Create(AOwner);
 SSocket.Port := 9998;
 SSocket.Active := false;
 SSocket.ServerType:= stNonBlocking;
 SSocket.ThreadCacheSize:= 10;
 SSocket.OnClientRead := ServerSocketClientRead;
 SSocket.OnClientError := ServerSocketClientError;
 SSocket.OnClientConnect := ServerSocketClientConnect;
 SSocket.OnClientDisconnect:= ServerSocketClientDisconnect;
pero no me dejaba luego liberarlo, al hacerlo me salía un error.

Pos eso, muchas gracias...

Última edición por dec fecha: 06-10-2005 a las 13:20:30. Razón: ¡¡Encerrad el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!!
Responder Con Cita
  #6  
Antiguo 06-10-2005
OscarG OscarG is offline
Miembro
 
Registrado: sep 2005
Posts: 35
Poder: 0
OscarG Va por buen camino
Bueno, conozco el FreeAndNil, pero no lo suelo usar...manias...

Lo q quiero decir con crear, viendo lo comentado y según me acuerdo, (es un programa q hice hace 1 año) es q yo creaba un cliente y un servidor.

TServerSocket
TClientSocket

El procedimiento para cada uno era tener una clase por cada y dentro de ella declarar un servidor o un cliente y q esa clase le controle su comportamiento...

Entonces, a estos les pasaba al crearlos el TComponent del formulario.

Entonces al destruir la clase q contenía el TServerSocket no me dejaba hacer un FreeAndNil del objeto, en cambio, con el TClientSocket si me dejaba...

Creo recordar q me comí un poco la cabeza probando formas diferentes para q no cascase, pero al final opté por q lo libere la aplicación al destruirse, ya q dependía del formulario principal...

Este caso, me mosqueo, xq me parecía q hacia todo bien
Código Delphi [-]
  SSocket:= TServerSocket.Create(AOwner);
  SSocket.Port :=               9998;
  SSocket.Active :=             false;
  SSocket.ServerType:=          stNonBlocking;
  SSocket.ThreadCacheSize:=     10;
  SSocket.OnClientRead :=         ServerSocketClientRead;
  SSocket.OnClientError :=         ServerSocketClientError;
  SSocket.OnClientConnect :=    ServerSocketClientConnect;
  SSocket.OnClientDisconnect:=  ServerSocketClientDisconnect;

pero no me dejaba luego liberarlo, al hacerlo me salía un error.

Pos eso, muchas gracias...
Responder Con Cita
  #7  
Antiguo 06-10-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Explicación detallada:

Tu hacias un .Free del SSocket, se libera pero no queda apuntando a nil el valor de SSocket, por tanto, cuando el Aowner se destruye, accede a SSocket, ve que es distinto de nil, e intenta liberar una zona de memoria que ya ha sido liberada => Access Violation.

Si hubieras usado Freeandnil(SSocket), cuando el Aowner va a destruirlo con .Free, se detecta que SSocket es = nil, y por tanto, no se destruye, No hay Access Violation.

Moraleja: Haz un curso de autoControl y quitate la manía que tienes con FreeAndNil

Un saludo
Responder Con Cita
  #8  
Antiguo 06-10-2005
OscarG OscarG is offline
Miembro
 
Registrado: sep 2005
Posts: 35
Poder: 0
OscarG Va por buen camino
Que yo sepa, FreeAndNil es lo mismo q poner un objeto Free y luego igualarlo a nil. Ya se q son 2 pasos en vez de uno pero creo q són lo mismo.

Me parece extraño q no lo haya probado, más bien diría imposible, (no poner FreeAndNil, sino, ponerlos por separados, Free y luego nil...) en el ejemplo del TServerSocket.

Si evito poner FreeAndNil es xq en mis inicios me dio algunos problemas q resolví quitandolo...seguramente sería por ser novato y si algo me da problemas he aprendido a evitarlos y buscar otra forma de hacerlo.

Hoy pienso q sería por otra cosa pero aún asi, intento evitarlo porsiaca.

He cargado una prueba q tenía de cuanto investigé los TServerSocket, y le he puesto FreeAndNil y casca, al igual q poner Free y luego Nil...en la prueba lo he puesto en el FormDestroy, luego lo he probado con un botón para crear un ServerSocket y otro para eliminarlo y me ha funcionado...asi q debe ser por ponerlo en el FormDestroy.
¿Xq´ casca en el Destroy?
Ya q si tengo el método para eliminarlo en el Destroy pero anteriormente con el botón q creé para eliminar el Server lo pulso, entonces no casca (ya q en el destroy miro si está asignado), sólo casca si está creado el ServerSocket y lo libero en el Destroy...
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


La franja horaria es GMT +2. Ahora son las 08:00:01.


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