[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