[C con Clase] Destrucción automática de objetos temporales

gdotta gdotta en telefonica.net
Sab Dic 6 21:04:20 CET 2008


No sé cómo hacer que los objetos temporales dinámicos devueltos por
referencia por algunos métodos se destruyan de forma automática. 
Por ejemplo, tengo una claseX con un operador suma sobrecargado que
devuelve por referencia objetos nuevos de la claseX:

class claseX{
	(... métodos diversos incluyendo destructor de memoria dinámica ...)
	(... atributos para los que se reserva memoria dinámica ...)
	claseX& operator+(const claseX& operando) const; 
};

El operador sobrecargado suma lo implemento como sigue:

claseX& operator+(const claseX& operando) const{
	claseX* temporal = new claseX(0);     //Aqui es donde creo el nuevo
objeto
	(...operaciones para crear la suma y guardarla en temporal...)
	return *temporal;     //Aqui devuelvo el nuevo objeto

En una función del programa uso objetos de esta clase:

void funcion(){
	claseX a(1);
	claseX b(2);
	claseX c(1);
	(a + b + c).visualiza(); //Método de ejemplo
}

Compruebo que los objetos temporales creados en el operador sobrecargado
suma (objeto b+c y objeto a+(b+c)) no pasan por el destructor y, por
tanto, no liberan memoria.

Por un lado, como las clases creadas tratan de imágenes de gran tamaño
interesa minimizar el trasiego de datos y, por otro, me gusta la
sintaxis clara y sencilla que se obtiene con operadores sobrecargados
que devuelven referencias a los objetos.

He pensado que la clase lleve una lista estática de los objetos
temporales que se crean para luego saber que hay que destruirlos, pero,
como el programa corre durante tiempos muy largos creando objetos
temporales que deberían destruirse al poco, no puedo esperar al final de
la ejecución ya que antes de eso se habrá llenado toda la memoria. 

Agradecería cualquier sugerencia.

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20081206/a43cc459/attachment.html>


Más información sobre la lista de distribución Cconclase