¿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
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
Respuesta Responder a este mensaje
#2 44r0x0r44
16/08/2004 - 12:31 | 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



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.
Respuesta Responder a este mensaje
#3 Eduardo A. Morcillo [MS MVP VB]
16/08/2004 - 17:20 | Informe spam
La verdad es que me gusta más la opción del desctructor (o
Dispose),



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.

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.



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
Respuesta Responder a este mensaje
#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:
> La verdad es que me gusta más la opción del desctructor (o
> Dispose),

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.

> 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.

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


Respuesta Responder a este mensaje
#5 44r0x0r44
17/08/2004 - 21: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:
> La verdad es que me gusta más la opción del desctructor (o
> Dispose),

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.

> 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.

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





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.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida