FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
FreeAndNil no libera los recursos
Hola, tengo el siguiente problema, Tengo la clase TConexionBD que es descendiente de un TDSServerModule, que creo vía código, realizando la siguiente llamada:
Donde FProviderDataBD, es una clase que contiene los parámetros de conexión de la BD (Nombre base de datos, login, password, ruta BD, etc). El constructor de TConexionBD es el siguiente: Y el destructor de TConexionBD es el que sigue: Destructor que es llamado de la siguiente forma: Como verán la destrucción la llevo a cavo utilizando el método freeandnil y validando con assigned que el objeto halla sido creado con anterioridad. Es de suponer que al destruir el objeto este quedara en nil, pero no es así. Si llamo a DestroyConexionBD dos veces en la segunda llamada dispara un error de violación de acceso, esto no debería pasar ya que Assigned comprueba que el objeto este creado para destruirlo. Preguntaran porque llamo 2 veces al destructor. El objeto se crea en forma manual por el usuario y también lo puede destruir el mismo usuario, pero los procedimientos al estar contenidos en un form la destrucción también se lleva a cavo al cerrar el form. Es decir, puede ocurrir que el usuario cierre el objeto y después al cerrar el form el cierre ocurre nuevamente. ¿Es correcta la forma de ?destruir el objeto?, ¿Assigned, comprueba realmente que el objeto ha sido creado?... Saludos.... |
#2
|
||||
|
||||
Hola doctorhd.
Cita:
Pero una clase puede no haber sido instanciada (o ya liberada) y su valor ser diferente de nil, como puede verificarse en este ejemplo:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
|||
|
|||
ecfisa, entonces de que forma puedo validar que un objeto a sido liberado. Pensé que freeandnil, liberaba los recursos y establecía su valor a nil, por lo cual assigned debería devolver false....
Saludos |
#4
|
||||
|
||||
doctorhd,
Cita:
Es exactamente lo que hace FreAndNil y es lo que se demuestra en el código del Msg #2. Revisa esta información: Espero sea útil Nelson. |
#5
|
|||
|
|||
nlsgarcia, entonces porque si al aplicar freandnil en mi código no establece el valor del objeto nil...
Saludos |
#6
|
||||
|
||||
doctorhd,
Cita:
Te sugiero hacer un debug al código en cuestión para verificar, cuando se aplica el FreeAndNil y cuando se verifica con Assigned la existencia del objecto. Solo a modo de pruebas puedes aplicar un FreeAndNil al objeto en cuestión justo antes de comprobar el mismo con Assigned y veras lo comentado en los Msg #2 y #4 Espero sea útil Nelson. |
#7
|
||||
|
||||
doctorhd,
Cita:
El problema radica en que estas pasando los objetos por valor y no por referencia al método TfunGlobal.CloseObjet. Revisa este código En el código anterior en Delphi 7 sobre Windows 7 Professional x32, el método TForm1.Button1Click instancia y libera objetos de la clase TNelson directamente, pero en el método TForm1.Button2Click la liberación de los objetos de la clase TNelson se hace por medio del procedimiento CloseNelson al cual se le pasa por referencia un arreglo de objetos TNelson, si el paso fuera por valor solo se aplicaria nil a los objetos actuales del arreglo Nelson del procedimiento CloseNelson, no a los objetos originales del arreglo Nelson del método TForm1.Button2Click, sin embargo los objetos serían liberados dado que el paso por valor contiene la referencia a los mismos. La solución es : Espero sea útil Nelson. Última edición por nlsgarcia fecha: 27-04-2015 a las 08:04:30. |
#8
|
|||
|
|||
nlsgarcia, Creo que ya encontré el error, este esta en la función que utilizo para cerrar los objetos:
Al parecer ciertos objetos se pasan por valor y no por referencia, ya que dentro del procedure freeandnil hace su trabajo y libera la memoria y los deja en nil, pero al salir del procedure dichos cambios no tienen efecto. Es muy raro ya que hasta donde se los objetos o clases siempre se pasan por referencia. Quizás exista algún error en la declaración del array que contiene los objetos... saludos... |
#9
|
||||
|
||||
doctorhd,
Cita:
Te sugiero revisar y probar todo lo comentado en el Msg #7. Espero sea útil Nelson. |
#10
|
|||
|
|||
nlsgarcia, no había visto tu mensaje anterior...Al parecer llegamos a la misma conclusión, pero ahora mi duda es, ¿no se supone que los objetos siempre se pasan por referencia, sin necesidad de utilizar var...?
Saludos y gracias por tu ayuda.. |
#11
|
||||
|
||||
doctorhd,
Cita:
Cita:
Nelson. |
#12
|
|||
|
|||
nlsgarcia, citando el mismo texto que me indicas...
Cita:
Cita:
Cita:
Saludos |
#13
|
||||
|
||||
doctorhd,
Cita:
Cita:
Espero sea útil Nelson. |
#14
|
||||
|
||||
doctorhd:
Una cosa es un puntero a la instancia (referencia de objeto) y otra un puntero a una variable puntero a la instancia (referencia de variable objeto). Cuando el parámetro es "Var", estás pasando éste último. De lo contrario estás pasando el primero, copiándose ese puntero en el parámetro, el cual actúa como una simple variable objeto local. Si lo pones en Nil, sólo esa "variable" adquiere el valor de Nil; las demás variables (exteriores) que apunten a la misma instancia de objeto seguirán igual. Espero no haberte confundido. Saludos. |
#15
|
|||
|
|||
Gracias nlsgarcia y Al González por sus respuestas, me queda claro el origen del error.
Ahora a raíz del cambio indicado por ustedes, tengo el siguiente problema...(no se si sera necesario abrir un nuevo hilo) al llamar a la función: tengo el siguiente error: el cual indica que no puedo pasar una constante como parámetro a una función que requiere una variable, cuestión que no es cierta, ya que FDetail es un campo de una clase que a su vez también es una clase, aquí va la definición de ambas:
Saludos... |
#16
|
||||
|
||||
Podemos convenir que FDetail es una variable, concretamente un campo de una clase debidamente instanciada. Eso está bien, pero el "[FDetail]" que vemos en tu código es lo que formalmente se denomina un constructor de matriz abierta (open array constructor).
Ese término no se refiere a un método constructor, sino a una construcción gramatical que lleva corchetes con el propósito de formar una matriz "al vuelo". Al formarse esa matriz (array), cada uno de los elementos que contiene son considerados por el compilador como valores constantes (los punteros, no las instancias a las que apuntan). Por ello es que aparece el error que te da el compilador. Si lo que necesitas es crear una rutina que reciba una matriz abierta de "variables" objeto, piensa en esa matriz o vector como una lista de punteros. Cada puntero señalando a una variable objeto. Para intentar ilustrarlo, tomo la función ghFreeNil de GH Freebrary que realiza una tarea similar (por ser el ejemplo más cercano que tengo). ¿Agarras la onda? |
#17
|
|||
|
|||
Gracias Al González. Y por supuesto Agarro la onda...
Saludos... |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
FreeAndNil VS Free | GerTorresM | OOP | 45 | 30-01-2012 01:54:24 |
Forms: FreeAndNil ó Release y la validación Assigned? | jbautista | Varios | 13 | 09-02-2010 17:33:03 |
Microsoft libera ASP .NET MVC | AzidRain | Noticias | 3 | 10-04-2009 19:06:52 |
Problemas FreeAndNil | OscarG | OOP | 4 | 09-11-2005 12:48:46 |
No libera la MEMORIA | pruz | Varios | 1 | 27-04-2004 21:30:33 |
|