[C con Clase] Ahora el destructor

Steven Davidson steven en conclase.net
Mar Jun 19 06:33:34 CEST 2007


Hola Rodolfo,

El pasado 2007-06-19 04:08:59, rodolfo escribió:

r> Hola, saludos a todos.
r> Gracias como siempre a Steven por la aclaración respecto a mi pregunta sobre 
r> el constructor de copia. Si, lo que trataba de hacer era una copia profunda, 
r> pero no estaba muy seguro de como, ahora si, thanks.

De nada. Me alegro de que vayamos aclarando las cosas.

r> Ahora tengo una duda respecto a los destructores;  Tengo una funcion miembro 

[CORTE]

r> Cuando reemplazo en el main() las lineas antes mencionadas por estas otras:
r> 	// verifica el operador sobrecargado +
r> 	// c1 = mortisaranga,  c2 = matachilanga
r> 	Cadena c33 = c1 + c2;
r> 	cout << "c33 arroja = " << c33 << "\n";
r> La corrida resulta:
r> Constructor de Conversion: 0x77fda0 - mortisaranga matachilanga
r> c33 arroja = mortisaranga matachilanga
r> Pregunta: ¿a donde se fue el destructor?, si se supone que la cadena
r> temporal en donde se almacenaba c1 + c2 ya hizo su trabajo cuando le
r> fue asignada a c33, ¿porque esa cadena temporal no se destruye?,
r> como si sucedio en el caso anterior, luego de que la cadena temporal
r> fue impresa en pantalla.

Vas por buen camino al suponer este comportamiento. Sin embargo, este objeto temporal es usado en la inicialización de 'c33' y por tanto se invoca el constructor copia. Esto es, la inicialización anterior se podría representar de la siguiente manera:

c33.Cadena( c1.operator+(c2) );

La gran mayoría de los compiladores es un tanto "lista" y se da cuenta de que nos podemos ahorrar crear un objeto temporal. Para el compilador, la secuencia de operaciones viene a ser la siguiente:

Cadena __temp__ = c1 + c2;
Cadena c33 = __temp__;

Como una optimización, elimina ese objeto temporal intermediario ya que decide que en este caso es innecesario mantenerlo puesto que va a ser creado y destruido para luego crear otro objeto. El comportamiento viene a ser que instanciamos un solo objeto: 'c33', en lugar de dos objetos de los cuales uno es temporal y por tanto destruido tan pronto es instanciado.

En resumen, es una "artimaña" para optimizar la ejecución de estas sentencias.

r> Bueno, espero no caer pesado con tanto detalle.

No. Si necesitas detallar, hazlo sin preocupaciones.


Espero haber aclarado la inquietud.

Steven


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