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.
 

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.

Preguntas similares