FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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... |
#2
|
||||
|
||||
Cita:
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. |
#3
|
|||
|
|||
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 a veces me explota ya en if Assigned pq ya no existe. ¿Ilógico no? |
#4
|
||||
|
||||
Cita:
Cita:
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. |
#5
|
|||
|
|||
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 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]!! |
#6
|
|||
|
|||
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
pero no me dejaba luego liberarlo, al hacerlo me salía un error. Pos eso, muchas gracias... |
#7
|
||||
|
||||
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 |
#8
|
|||
|
|||
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... |
|
|
|