[C con Clase] Destrucc ión automátic a de objetos temporales

srd4121 en njit.edu srd4121 en njit.edu
Dom Dic 7 12:54:54 CET 2008


Hola gdotta,

Mensaje citado por: gdotta <gdotta en telefonica.net>:

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

Sinceramente, no veo por qué tienes que instanciar dinámicamente un objeto 
dentro de la función. Bastaría con crear un objeto local y retornarlo. Esto 
sería,

claseX operator+( const claseX& operando ) const
{
  claseX temporal(0);  // Instanciamos un nuevo objeto local
  // más sentencias

  return temporal;  // Retornamos el objeto local
}

Ahora podemos hacer lo siguiente:

cout << a+b+c << endl;

Obviamente, necesitaríamos sobrecargar el operador << para que funcionara con 
objetos de la clase 'ostream'.

De todos modos, estos objetos temporales serán destruidos al finalizar esta 
sentencia.


Ahora bien, si no te queda más remedio que usar punteros y memoria dinámica 
como puede ser el hecho de que estés usando objetos polimórficos, entonces 
creo que deberías replantear el diseño. Una técnica ya implementada en las 
bibliotecas de ANSI C++ es la clase-plantilla 'auto_ptr<>'. Esto vendría a ser 
algo parecido a lo que he mencionado anteriormente, pero en lugar de retornar 
un objeto de la clase en cuestión, retornamos uno de la 
clase 'auto_ptr<claseX>'. Esto implica que tendrás que rediseñar algunas 
funciones para que usen esta clase y no la original. La ventaja de usar esta 
plantilla es que al destruirse este objeto su destructor también destruye al 
objeto al que apunta internamente. Es decir, al destruir un 
objeto 'auto_ptr<claseX>' también se destruye el objeto de la clase 'claseX' 
asociado. Tienes que incluir el fichero de cabecera <memory>.

Otra posibilidad es implementar una factoría o fábrica de objetos 'claseX'. 
Básicamente, va creando objetos de tal clase y los gestiona. Internamente, se 
trata de una lista dinámica de objetos. Cuando se destruya la fábrica, también 
se destruirán los objetos que instanció. Esto es parecido a un recolector de 
basuras, como tiene Java y C#, pero sin ser automático.


Reitero que deberías rediseñar las funciones para que no usen memoria dinámica 
y simplemente uses objetos locales "regulares". Te evitarías muchos 
quebraderos de cabeza.


Espero que esto te sirva de orientación.

Steven





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