Duda sobre cuando borrar o limpiar un objeto.

21/05/2008 - 20:15 por Tomas | Informe spam
Hola a todos.

Resumiendo mucho, tengo unas clases que esquemáticamente quedan así:

class ClaseA
{
// Metodos y variables
}

class ClaseB
{

// Necesito compartir el objeto entre muchos métodos de la ClaseB.
private ClaseA m_objeto;

private void Metodo1()
{
// Cada vez que se llama a este método se crea un nuevo objeto de la ClaseA
m_objeto = new ClaseA();
m_objeto.SeEjecutanMetodosDelObjeto();
}


private void Metodo2()
{
// Se llaman a varios metodos de la ClaseA.
m_objeto.SeEjecutanMetodosDelObjeto();
m_objeto.SeEjecutanMetodosDelObjeto();
m_objeto.SeEjecutanMetodosDelObjeto();
}

private void MetodoPrincipal()
{
Metodo1();
Metodo2();

// Entre llamada y llamada al Metodo1, ¿debo borrar m_objeto?

Metodo1();
Metodo2();

// ¿Borrar m_objeto, lo hace el recolector automaticamente o estoy
perdiendo la memoria?

Metodo1();
Metodo2();
}

}

La duda esta en que no sé si el objeto que comparto entre muchos métodos de
la ClaseB lo tengo que borrar o limpiar de alguna forma porque no sé si
estoy perdiendo memoria sin hacer nada entre las llamadas al Metodo1 y la
creación de un nuevo objeto de ClaseA que se hace en el Metodo1.

Espero que quede clara la pregunta.

Gracias por anticipado.

Tomás.

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
22/05/2008 - 07:33 | Informe spam
"Tomas" wrote in message
news:
Resumiendo mucho, tengo unas clases que esquemáticamente quedan así:

class ClaseA
{
// Metodos y variables
}

class ClaseB
{

// Necesito compartir el objeto entre muchos métodos de la ClaseB.
private ClaseA m_objeto;

private void Metodo1()
{
// Cada vez que se llama a este método se crea un nuevo objeto de la
ClaseA
m_objeto = new ClaseA();
m_objeto.SeEjecutanMetodosDelObjeto();
}


private void Metodo2()
{
// Se llaman a varios metodos de la ClaseA.
m_objeto.SeEjecutanMetodosDelObjeto();
m_objeto.SeEjecutanMetodosDelObjeto();
m_objeto.SeEjecutanMetodosDelObjeto();
}

private void MetodoPrincipal()
{
Metodo1();
Metodo2();

// Entre llamada y llamada al Metodo1, ¿debo borrar m_objeto?

Metodo1();
Metodo2();

// ¿Borrar m_objeto, lo hace el recolector automaticamente o estoy
perdiendo la memoria?

Metodo1();
Metodo2();
}

}

La duda esta en que no sé si el objeto que comparto entre muchos métodos
de la ClaseB lo tengo que borrar o limpiar de alguna forma porque no sé si
estoy perdiendo memoria sin hacer nada entre las llamadas al Metodo1 y la
creación de un nuevo objeto de ClaseA que se hace en el Metodo1.

Espero que quede clara la pregunta.



En principio, y a condición de que ClaseA no utilice por dentro ningún
recurso no-gestionado (unmanaged), no tienes que preocuparte de nada, ya que
el recogedor de basura (Garbage Collector) se encargará de todo y liberará
la memoria cuando lo estime oportuno. Si lo deseas, entre las dos llamadas a
Metodo1 puedes poner m_objeto=null; Esto no libera la memoria, sino que lo
único que hace es poner el objeto a disposición del recogedor de basura para
que éste lo pueda liberar cuando le convenga. Solo tiene sentido si entre
medias de esta operación y la siguiente asignación a m_objeto realizas otras
operaciones que puedan necesitar esa memoria. En caso contrario, no ganas
nada frente a dejar que se ejecute directamente m_objeto=new ClaseA(), ya
que en ambos casos el antiguo objeto al que hacía referencia m_objeto pasa a
disposición del Recogedor de Basura.
Respuesta Responder a este mensaje
#2 Tomas
22/05/2008 - 08:24 | Informe spam
Gracias, no tenia claro si la memoria se perdía, al no hacer algo para
liberarla, antes de la nueva asignación con new.

Por lo visto, el recolector hace el trabajo de comprobar que el estado del
objeto cambia, para liberar la memoria que consumía.

Gracias de nuevo y un saludo.


"Alberto Poblacion"
escribió en el mensaje news:%
"Tomas" wrote in message
news:
Resumiendo mucho, tengo unas clases que esquemáticamente quedan así:

class ClaseA
{
// Metodos y variables
}

class ClaseB
{

// Necesito compartir el objeto entre muchos métodos de la ClaseB.
private ClaseA m_objeto;

private void Metodo1()
{
// Cada vez que se llama a este método se crea un nuevo objeto de la
ClaseA
m_objeto = new ClaseA();
m_objeto.SeEjecutanMetodosDelObjeto();
}


private void Metodo2()
{
// Se llaman a varios metodos de la ClaseA.
m_objeto.SeEjecutanMetodosDelObjeto();
m_objeto.SeEjecutanMetodosDelObjeto();
m_objeto.SeEjecutanMetodosDelObjeto();
}

private void MetodoPrincipal()
{
Metodo1();
Metodo2();

// Entre llamada y llamada al Metodo1, ¿debo borrar m_objeto?

Metodo1();
Metodo2();

// ¿Borrar m_objeto, lo hace el recolector automaticamente o estoy
perdiendo la memoria?

Metodo1();
Metodo2();
}

}

La duda esta en que no sé si el objeto que comparto entre muchos métodos
de la ClaseB lo tengo que borrar o limpiar de alguna forma porque no sé
si estoy perdiendo memoria sin hacer nada entre las llamadas al Metodo1 y
la creación de un nuevo objeto de ClaseA que se hace en el Metodo1.

Espero que quede clara la pregunta.



En principio, y a condición de que ClaseA no utilice por dentro ningún
recurso no-gestionado (unmanaged), no tienes que preocuparte de nada, ya
que el recogedor de basura (Garbage Collector) se encargará de todo y
liberará la memoria cuando lo estime oportuno. Si lo deseas, entre las dos
llamadas a Metodo1 puedes poner m_objeto=null; Esto no libera la memoria,
sino que lo único que hace es poner el objeto a disposición del recogedor
de basura para que éste lo pueda liberar cuando le convenga. Solo tiene
sentido si entre medias de esta operación y la siguiente asignación a
m_objeto realizas otras operaciones que puedan necesitar esa memoria. En
caso contrario, no ganas nada frente a dejar que se ejecute directamente
m_objeto=new ClaseA(), ya que en ambos casos el antiguo objeto al que
hacía referencia m_objeto pasa a disposición del Recogedor de Basura.


Respuesta Responder a este mensaje
#3 Eduardo
22/05/2008 - 13:13 | Informe spam
En principio, y a condición de que ClaseA no utilice por dentro ningún
recurso no-gestionado (unmanaged),



Una pregunta, como uno sabe que se esta usando un recurso no-gestionado ?
Respuesta Responder a este mensaje
#4 Alberto Poblacion
22/05/2008 - 13:56 | Informe spam
"Eduardo" wrote in message
news:eghyQz$
En principio, y a condición de que ClaseA no utilice por dentro ningún
recurso no-gestionado (unmanaged),



Una pregunta, como uno sabe que se esta usando un recurso no-gestionado ?



Una de dos, o lo has llamado tú mediante Interop (Por ejemplo, llamando
a una API de Windows o a un objeto COM), o estás llamando a una clase de
.Net que a su vez usa Interop. Por ejemplo, esto ocurre cuando creas y abres
un SqlConnection que a su vez usa internamente Interop para crear una
conexión a Sql Server. En estos casos, si esta clase a la que llamas está
bien escrita, implementa el interfaz IDisposable que la dota de un método
Dispose al que deberías de llamar para pedirle que libere los recursos no
gestionados.
Respuesta Responder a este mensaje
#5 Eduardo
22/05/2008 - 16:01 | Informe spam
Gracias.

"Alberto Poblacion"
escribió en el mensaje news:
"Eduardo" wrote in message
news:eghyQz$
En principio, y a condición de que ClaseA no utilice por dentro
ningún recurso no-gestionado (unmanaged),



Una pregunta, como uno sabe que se esta usando un recurso no-gestionado ?



Una de dos, o lo has llamado tú mediante Interop (Por ejemplo, llamando
a una API de Windows o a un objeto COM), o estás llamando a una clase de
.Net que a su vez usa Interop. Por ejemplo, esto ocurre cuando creas y
abres un SqlConnection que a su vez usa internamente Interop para crear
una conexión a Sql Server. En estos casos, si esta clase a la que llamas
está bien escrita, implementa el interfaz IDisposable que la dota de un
método Dispose al que deberías de llamar para pedirle que libere los
recursos no gestionados.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida