¿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

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
16/08/2004 - 05:25 | Informe spam
Mostrar la cita
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.

Mostrar la cita
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
#2 44r0x0r44
16/08/2004 - 12:31 | Informe spam
Mostrar la cita
esta se pasa a
Mostrar la cita
suponiendo que esto no
Mostrar la cita
la pila.
Mostrar la cita
manejan en forma
Mostrar la cita
almacenan
Mostrar la cita
un nuevo valor el
Mostrar la cita
variable sale del
Mostrar la cita
con estos tipos.
Mostrar la cita
objeto de tipo
Mostrar la cita
variable liberara
Mostrar la cita
alguna otra
Mostrar la cita
memoria. Eso si,
Mostrar la cita
IDisposable entonces
Mostrar la cita
recursos que esta
Mostrar la cita
queda) ya que no sabes
Mostrar la cita
La verdad es que me gusta más la opción del desctructor (o
Dispose), prefiero tener YO la responsabilidad de
desasignar mis asignaciones dinamicas ^_^ ya que no tengo
la garantia de que el recolector elimine estas asignaciones
y además si lo hace no se CUANDO lo hace.
#3 Eduardo A. Morcillo [MS MVP VB]
16/08/2004 - 17:20 | Informe spam
Mostrar la cita
Dispose no es un destructor sino una forma de hacer que el objeto libere
recursos no manejados por el CLR (como por ejemplo archivos) en un momento
determinado en lugar de esperar a la recoleccion.

Mostrar la cita
Puedes usar Dispose para liberar recursos, pero esto no va a descargar de
memoria al objeto, ni siquiera si no hay mas referencias a el. Te guste o
no, el objeto recien sera eliminado de memoria cuando ocurra la recoleccion.
Y la recoleccion esta garantizada lo unico es que no sabes cuando es que va
a ocurrir.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
#4 Jose Carlos
16/08/2004 - 18:06 | Informe spam
Creo que puedes forzar al recolector con GC.Collect() con lo que liberas
memoria, pero esto logicamente necesita tiempo para ejecutarse.

"Eduardo A. Morcillo [MS MVP VB]" <emorcilloATmvps.org> escribió en el
mensaje news:
Mostrar la cita
recoleccion.
Mostrar la cita
va
Mostrar la cita
#5 44r0x0r44
17/08/2004 - 21:06 | Informe spam
Mostrar la cita
lo que liberas
Mostrar la cita
ejecutarse.
Mostrar la cita
escribió en el
Mostrar la cita
el objeto libere
Mostrar la cita
archivos) en un momento
Mostrar la cita
asignaciones
Mostrar la cita
va a descargar de
Mostrar la cita
a el. Te guste o
Mostrar la cita
ocurra la
Mostrar la cita
sabes cuando es que
Mostrar la cita
No encuentro la clase GC ¿en que espacio de nombres se
encuentra?

Otra pregunta, comentabas que Point es una estructura y no
una clase y que por lo tanto las siguientes instrucciones:

Dim pt as Point
pt = New Point(44,44)

Con esto creo DINAMICAMENTE un punto (no nos metamos con la
coherencia del código ;) y si seguidamente hago:

pt = Point.Empty()

Insisto: ¿Que pasa con el punto [44,44] que fué creado
dinamicamente?, y ocupó memoria, y estaba referenciado por pt.

Pt no es lo que en C llamamos "puntero" porque puede acoger
tanto el resultado de New como un valor directo, pero si
fuese un puntero y hubiese estado apuntando a "New
Point(44,44)" al igualarlo a "Empty()" ¿se habrá quedado
"New Point(44,44)" flotando en la memoria?

Estoy confuso con la dualidad puntero/no puntero de las
variables de VB.
Ads by Google
Search Busqueda sugerida