https://foro.gambas-es.org/viewtopic.php?f=1&t=2999
-----------------------------------
shordi
Domingo, 17 Marzo 2013, 22:40

Clase Destructora
-----------------------------------
Tengo una clase (aspirante a convertirse en componente... pero todavía no) que hereda de gridview. Cuando cierro el formulario que la contiene genera por consola una serie de warnings de "allocations non freed".

Imagino que se refiere a que hay valores asignados en memoria que al destruir la clase quedan ocupados y no puede liberarse la memoria que ocupa. ¿Cómo se puede evitar eso?

Creo que debería haber un método inverso de _new()

que permitiese destruir una clase...

¿Alguna pista?


-----------------------------------
sebikul
Lunes, 18 Marzo 2013, 03:28

Re: Clase Destructora
-----------------------------------
Por supuesto. No esta documentada, ni aparece en la IDE como pista cuando comienzas a escribir un método especial. 

[code linenumbers=false syntax=gambas]
Public Sub _free()
...
End
[/code]

[url=http://sourceforge.net/p/gambas/code/5582/tree/gambas/trunk/comp/src/gb.net.pop3/.src/_Pop3Client_Message.class]Aqui tienes un ejemplo del componente gb.net.pop3. Linea 114-118

El mensaje del que hablas es uno de los mas difíciles de solucionar, cualquier ayuda que necesites no dudes en consultar!


-----------------------------------
shordi
Lunes, 18 Marzo 2013, 09:56

Re: Clase Destructora
-----------------------------------
¡Gracias! Justo lo que buscaba. 
Ya te contaré cómo me ha ido.

Saludos.


-----------------------------------
shordi
Lunes, 18 Marzo 2013, 13:59

Re: Clase Destructora
-----------------------------------
Pues no funciona. Mejor dicho sí funciona, pero no desaparece el error. El evento se dispara perfectamente... pero sigue dándome el warning de que 14 allocations non freed.
La clase se plantea así:
[code linenumbers=false syntax=gambas]
Export

Inherits GridView

Property consulta As String
Property order As String
Property aanchos As Integer[]
Property atitulos As String[]
Property hconn As MConexion
Property filtro As String
Property Read tabla As String
Property rslt As Result
Property formulario As Form
Property bgcolor As Integer
Property forecolor As Integer
Property cebra As Boolean
Property colorresaltado As Integer
Property verIdentificador As Boolean
Property Read isShift As Boolean

Private rs As Result
Private orden As String
Private anchos As New Integer[]
Private hcon As MConexion
Private titulos As New String[]
Private sql As String
Private formu As Form
Private query As New Collection
Private obs As Observer
Private lastcolor As Integer
Private lastrow As Integer
Private lastcolumn As Integer
Private colordefondo As Integer
Private colordeletra As Integer
Private actual As Integer
Private lcebra As Boolean
Private fila As Integer
Private colorceldactiva As Integer
Private verId As Boolean
Private may As Boolean
[/code]

Como veis tiene 15 properties que, por proximidad de número, creo que son las que no se liberan (salvo tal vez el observer... imagino).
Lo que he intentado, ingenuo de mí, es restaurarlas a los valores originales, es decir a 0 los integer, etc. etc. Los que se dejan a Null... pero no he solucionado nada con ello.
Es que no sé cómo forzar la liberación de una variable. En VB, creo recordar, siempre podías poner algo así como
[quote] mivariable = nothing[/quote] 
Cosa que aquí echaría de menos...

Por si alguien se anima, adjunto la clase entera. Es un gridview al que se han asociado comportamientos y objetos, de manera que lleve en su interior todo lo necesario para funcionar. (Si a alguien le interesa adjuntaré un ejemplo de cómo funciona... cuando lo haga). En última instancia me gustaría transformarlo en componente, de manera que en el IDE apareciesen algunas de sus propiedades y demás.


-----------------------------------
sebikul
Lunes, 18 Marzo 2013, 19:02

Re: Clase Destructora
-----------------------------------
Para poder ayudarte necesitaría el proyecto completo, ya que sino no puedo ejecutar esta clase por separado en un proyecto vació. Faltan otras clases que no estarían declaradas. Intenta declarar _free de ésta manera a ver si funciona.

[code linenumbers=false syntax=gambas]
Public Sub _free()
rs = Null
anchos = Null
hcon = Null
titulos = Null
formu = Null
query = Null
obs = Null
End[/code]


-----------------------------------
shordi
Lunes, 18 Marzo 2013, 19:55

Re: Clase Destructora
-----------------------------------
Ok. A ver si tengo un ratito y te hago una ejemplo de uso de la clase.

Saludos.


