https://foro.gambas-es.org/viewtopic.php?f=1&t=188
-----------------------------------
cyberx0x
Thursday, 05 November 2009, 01:13

¿Como Destruyo Un Objeto?
-----------------------------------
Mi pregunta es como destruyo un objeto ya creado para poder liberar la memoria utilizada,tengo entendido que es con free pero no tengo idea como , si alguien puede ayudarme y si pueden subir codigo que mejor les estare muy agradecidos


-----------------------------------
soplo
Thursday, 05 November 2009, 05:37

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
Hola
El método _free no es para destruir objetos. El método _free se ejecuta cuando el evento se destruye para deshacer algo que hiciste al crearlo (por ej. cerrar un stream que abriste al crearlo).

Para destruir un objeto muchos objetos tienen el método .delete
Dim T as new textbox ---> al hacer esto se crea un nuevo objeto T de clase textbox y se ejecuta _new
...
T.delete ---> eliminas el objeto T y se ejecuta _free

Si no es puramente un objeto, pero es un stream lo destruyes al cerrarlo por ejemplo. Los stream no se destruyen. Se cierran. Los sockets, los ficheros, etc son streams de diferentes tipos. Por eso en un socket no encontraras el método .delete pero encontrarás el .close


-----------------------------------
cyberx0x
Thursday, 05 November 2009, 06:30

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
Mira lo que pasa es que tengo un algoritmo genetico que usa arboles binarios, al principio creo unos 30 de esos arboles despues apligo el genetico y los arboles que no me sirven los tengo que borrar si no se me satura la memoria, como le hago para destruir esos arboles que ya no me sirven


-----------------------------------
soplo
Thursday, 05 November 2009, 14:18

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
No sé muy bien lo que es un arbol genético.

Me puedo imaginar que quizá es un esquema de padres/hijos/nietos. Igual si, igual no, igual tiene muchas mas implicaciones.
En lo que se refiere a informática ¿Estas hablando de un treeview y lo que quieres es borrar una rama? ¿Estas hablando de un columnview y lo que quieres es borrar unas filas? ¿Estas hablando de objetos diversos esparcidos por un formulario?

Deberías ser más concreto en tus preguntas y aportar ejemplos de tu código para poder ver cómo abordar tu problema.

[color=#660000][size=8]Mensaje moderado por Administrador[/size][/color]


-----------------------------------
maikl
Thursday, 05 November 2009, 19:20

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
Creo que está creando objetos en memoria que serian como "entes" que contienen una serie de información, esta información se cruza con otros "entes" como si se reproduciesen obteniendo un nuevo ente con un mix de las caracteresticas, que tendrian una información nueva, mejor o peor. 
Luego un algoritmo recorre los entes y comprueba su "peso" o su calidad descartando los peores elementos (como con la selección natural o artificial), dejando algunos malos para evitar estancamientos posiblemente.
Supongo que lo que quiere saber es como eliminar completamente los entes o genes, los objetos que ya no son necesarios.
En vb6 seria un
Set objEnteMalo = Nothing
Es una suposición.


-----------------------------------
jguardon
Thursday, 05 November 2009, 19:39

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
Pero el problema no es seguramente entender el algoritmo, sino entender qué clase de objetos utiliza y cómo los genera... llámese colección, array, o la clase de objeto que sea, para poder determinar la manera de destruírlos y liberar recursos.

Cuando se plantea un problema, es muy conveniente concretar mucho más, no ser tan ambiguo y si es posible adjuntar el código que empleas, o al menos un pseudocódigo. Es mi opinión y creo que la de muchos. De otro modo no será posible ofrecer ayuda alguna, por mucho que queramos.

Saludos


-----------------------------------
cyberx0x
Friday, 06 November 2009, 02:53

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
Ha ya entiendo cual es el problema, miren lo unico que necesito es que me enseñen a liberar esa memoria, supongamos que tengo el objeto individuo que tiene lo siguiente

nombre string
edad integer 
peso float
 
y pues creo unos 4 individuos

juan = new individuo
pedro= new individuo 
luis = new individuo 
adrian = new individuo 

pero ahora supongamos (en teoria que la memoria de la computadora solo soporta 4) y quiero crear otro como le hago para matar a uno de estos tipos y permitir que nazca otro



no hay problema del abb o del algoritmo genetico lo unico que necesito es como destruir objetos


-----------------------------------
soplo
Friday, 06 November 2009, 04:52

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
Hola
Ya veré cuando tenga mas tiempo pero mas o menos te doy la idea de lo que tienes que hacer.

1 Tienes que crear un nuevo control. 
2. Para ello creas una clase nueva con las propiedades nombre, edad, peso y que herede la clase control.
3. Por haber añadido estas propiedades tu podras crear nuevas instancias de esa clase que tendrá las propiedadse que tu necesitas y el método .delete para destruirlo.

Aquí tienes alguna información al respecto
[url=http://foro.gambas-es.org/viewtopic.php?f=1&t=100]Gambas: clases y objetos
[url=http://foro.gambas-es.org/viewtopic.php?f=4&t=175]Ayuda en la creación de un componente

De la creacion del componente hay cosas que no necesitas porque tu no vas a exportarlo a gambas como un componente mas (seguramente) pero en ese post se explica como crear un control y como exportarlo a gambas. A  ti te interesa saber como crear el control. Una vez lo tengas creado cada vez que quieras crearlo haces un nuevo new y cada vez que quieres destruirlo haces un nuevo .delete

Echa un vistazo y si no te sale a ve que podemos hacer 
 :mryellow:


-----------------------------------
maikl
Friday, 06 November 2009, 15:10

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
No se si seria bueno hacer un control para esto, ya que será un objeto pesado al ser heredado de "control", creo que necesita un objeto lijero que solo tenga lo que necesita.
Me parece que la pregunta se podria resumir en:
Hay algo parecido al "Set miobjeto = Nothing" de visual basic 6?


-----------------------------------
soplo
Friday, 06 November 2009, 15:56

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
Hasta donde yo se no lo hay.

Por eso veo como solución la creación de un control que no veo porque tiene que ser pesado porque al fin y al cabo es una clase con las propiedades de edad, peso y nomber pero que hereda las propiedades de los controles enter las que se encuentran los métodos new y delete.

sería cuestión de hacer pruebas a ver el peso en memoria pero creo que es algo factible.


-----------------------------------
maikl
Friday, 06 November 2009, 20:30

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
Creo que seria mas facil de lo que parece.
Si guardas los objetos en una matriz tan solo tendras que llamar a la función remove() del array para quitar un objeto de la matriz.

Dim objObjetos as clsMiClase[]
dim objMiObjeto1 as clsMiClase, objMiObjeto2 as clsMiClase

objmiobjeto1 = new clsmiclase()
objmiobjeto1.proviedad = "HOLA"
objmiobjeto2 = new clsmiclase()
objmiobjeto2.proviedad = "HOLA"

objObjetos.Add(objmiobjeto1)
objObjetos.Add(objmiobjeto2)

objobjetos.remove(1) '<-Va por índice.

Podria servir?


-----------------------------------
jguardon
Friday, 06 November 2009, 20:51

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
[quote user="maikl" post="889"]Creo que seria mas facil de lo que parece.
Si guardas los objetos en una matriz tan solo tendras que llamar a la función remove() del array para quitar un objeto de la matriz.

Dim objObjetos as clsMiClase[]
dim objMiObjeto1 as clsMiClase, objMiObjeto2 as clsMiClase

objmiobjeto1 = new clsmiclase()
objmiobjeto1.proviedad = "HOLA"
objmiobjeto2 = new clsmiclase()
objmiobjeto2.proviedad = "HOLA"

objObjetos.Add(objmiobjeto1)
objObjetos.Add(objmiobjeto2)

objobjetos.remove(1) '<-Va por índice.

Podria servir?[/quote]

Yo creo que ahí le has dado... porque me supongo que cyberx0x estará almacenando los objetos creados en un array o una colección, por tanto bastaría eliminar o 'remover' los ítems de ese array una vez hayan sido utilizados o mostrados en un control.
También se podría crear un[b] for...each[/b] para hacerlo de un tirón, o incluso mejor:[b] array.Clear()[/b]

Saludos


-----------------------------------
soplo
Saturday, 07 November 2009, 00:31

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
No es igual un caso que otro y la programación de un control lleva un trabajo previo (tampoco tanto, a maiki le llevó una tarde y eso que él estaba abriendo camino de algo que nadie aquí había hecho antes) pero no es ni parecido a trabajar con un conjunto de tablas y probablemente ocupa menos en memoria.

El día que se quiera añadir algo basta con añadir una propiedad a ese control Como no tengo ni idea de esas cosas pues no se si tendrá sentido lo que digo pero se me ocurre que podría tener una propiedad padre y una propiedad hijo para especificar quien es hijo de quien.

Eso supone un problema añadido porque supone la utilización de algoritmos de inserción de elementos en listas y tal que estudiamos en su día (nada del otro mundo) pero que en el caso de utilizar arrays puede hacerse bastante lioso. No se si es le caso, solo lo menciono para ilustrar la posibilidad de añadir funcionalidades.

Pero bueno cyber0x es quien sabe lo que quiere hacer
 :mryellow:


-----------------------------------
fabianfv
Saturday, 07 November 2009, 01:59

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
En general para liberar la memoria que ya no se usa se utilizan dos aproximaciones diferentes:

[list]
[*]Garbage Collector: se encarga de liberar la memoria que ya no se usa de forma automática y transparente.
[*]Refence Counter: es una forma más simple, pero más rápida de liberar la memoria, y es la que usa Gambas. En este caso cuando un objeto no tiene una referencia (un puntero hacia ese objeto) se elimina automáticamente. El inconveniente es que como programador debes controlar las referencias que haces a una misma instancia (objeto) y que no estés creando un ciclo.
[/list]

Entonces, cuando instancias una clase en Gambas estás creando un puntero (una referencia) hacia esa instancia. Si de-referencias el objeto, adiós objeto.

[code linenumbers=false syntax=gambas]
'la variable miobjeto es un puntero hacia la nueva instancia de miclase
miobjeto = NEW miclase 
'ahora el contador de referencias del objeto es igual a 1 (suponiendo que en ningun otro lugar del programa se creó una instancia de miclase)

...

'Para eliminar la refencia al objeto:
miobjeto = NULL
'Ahora el contador de referencias del objeto es igual a 0 y Gambas liberará la memoria que ocupa inmediatamente.
[/code]


-----------------------------------
soplo
Saturday, 07 November 2009, 03:47

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
según eso tu puedes poner Miobjeto=null al igual que en vb se hacía set objeto=nothing?

¿Estas diciendo eso?

¡Mañana lo pruebo!

 :mryellow:


-----------------------------------
maikl
Saturday, 07 November 2009, 14:36

Re: ¿Como Destruyo Un Objeto?
-----------------------------------
Entonces si la variable es local a una función, al salir de la función se destruye la variable como si hiciésemos "=NULL".
Pero si dentro de la función se ha igualado una variable externa al objeto que representaba la variable local, como el objeto aún tiene un apuntador no se eliminará.
Cuando hagamos "varglobal = NULL" será cuando no queden mas apuntadores al objeto y este se libere.
Entonces como VB6. 
Entre el garbage collector y este método prefiero este, más rápido a la hora de liberar la memória, sin ningun proceso corriendo por ahí buscando cachos perdidos para liberarlos. Alguien sabe las ventajas del garbage collector? a parte de solucionar descuidos del programador.
Que bonito es aprender!


