¿Que pasa con los new?

16/08/2004 - 02:18 por 44r0x0r44 | Informe spam
Hace poco que me he iniciado en VB.NET y en los códigos de
ejemplo que he podido ver observo que se usa bastante
indiscriminadamente el "new"

Application.Run(new F) '¿quien referencia a F?

Vale que queda muy bonito, pero en códigos así no veo
ningún delete F; el siguiente ejemplo es peor:

apt(y) = Nothing

apt es una matriz de clases Point que han sido creadas a
traves de ciertas posiciones del mouse: apt(y) = new
Point(mea.X, mea.Y), si ahora igualo apt(y) a Nothing ¿que
pasa con el punto que estaba almacenado en apt(y)? ¿queda
flotando en el limbo de la memoria? ¿que garantias tengo
que el recolector de basuras se lo cargue?, no se como
funciona esto de la memoria dinamica en VB.NET ¿alguien me
puede aclarar estas dudas?

Muchas gracias
 

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
16/08/2004 - 05:25 | Informe spam
Application.Run(new F) '¿quien referencia a F?



La referencia a la nueva instancia se guarda en la pila y esta se pasa a
Run. Por su parte Run guarda otra referencia pero suponiendo que esto no
ocurra la referencia existira hasta que sea eliminada de la pila.

apt(y) = Nothing

apt es una matriz de clases Point que han sido creadas a
traves de ciertas posiciones del mouse: apt(y) = new
Point(mea.X, mea.Y), si ahora igualo apt(y) a Nothing ¿que
pasa con el punto que estaba almacenado en apt(y)? ¿queda
flotando en el limbo de la memoria? ¿que garantias tengo
que el recolector de basuras se lo cargue?



Point no es una clase sino una estructura y estas se manejan en forma
diferente. Una estructura es un tipo por valor y estos se almacenan
directamente en la variable. Esto significa que al asignar un nuevo valor el
anterior automaticamente se destruye. Lo mismo pasa si la variable sale del
ambito en el que fue definida. El recolector no se utiliza con estos tipos.

Ahora si suponemos que lo que habia en el arreglo era un objeto de tipo
referencia entonces el asignar una nueva referencia a la variable liberara
la existente y si no hay mas referencias a ese objeto en alguna otra
variable entonces el recolector eliminara el objeto de memoria. Eso si,
debes tener en cuenta que si la clase implementa IDisposable entonces
deberias llamar a Dispose para que el objeto libere los recursos que esta
usando (siempre y cuando sea la ultima referencia que queda) ya que no sabes
cuando ocurrida la recoleccion que los libere.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo

Preguntas similares