[C con Clase] Ahora el destructor

rodolfo rosso paz rodolforossopaz en hotmail.com
Mar Jun 19 06:08:57 CEST 2007


Hola, saludos a todos.

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

Ahora tengo una duda respecto a los destructores;  Tengo una funcion miembro 
que
sobrecarga el operando + para sumar 2 objetos Cadena (tipo creado en el 
programa)
la función es la siguiente, y funciona, asi que se la pueden saltar, por ahi 
no va mi pregunta:


	// concatena this con el operando derecho y devuelve
	// una Cadena para que pueda ser asignada a otro objeto Cadena o ser 
impresa
	const Cadena Cadena::operator+( const Cadena &derecha )
	{
	   size_t sumaLongitud = longitud + derecha.longitud;  // suma de 
longitudes
	   char *pTemp = new char[ sumaLongitud + 1 ];  // reserva memoria

	   strcpy( pTemp, ptrC );                     // copia ptrC (la cadena tipo 
C de this)
	   strcpy( pTemp + longitud, derecha.ptrC );  // copia derecha.ptrC (cadena 
tipo C de derecha)

	   Cadena cadenaTemp(ptrTemp);  // crea un objeto cadena temporal invocando 
al constructor de
	                                // conversion
	   delete[] pTemp;              // reclama el espacio

	   return cadenaTemp;  // permite las llamadas en cascada

	} // fin de la función operator+


Ademas, tengo un constructor de conversión que convierte las cadenas de tipo 
C en cadenas
de tipo Cadena, y un destructor, ambas funciones miembro me pintan en 
pantalla cuando son
invocadas por el compilador: la cadena que estan convirtiendo o destruyendo 
y la direccion de
esa cadena para saber quien destruye a quien.

en la funcion main(), tengo las siguientes lineas:

	// verifica el operador sobrecargado +
	// c1 = mortisaranga,  c2 = matachilanga
	cout << "c1 + c2 arroja = " << c1 + c2 << "\n";


Resultado de la corrida:

Constructor de Conversion: 0x77fda0 - mortisaranga matachilanga
c1 + c2 arroja = mortisaranga matachilanga
Destructor: 0x77fda0 - mortisaranga matachilanga

Hasta aqui todo perfecto, el destructor hace lo esperado destruyendo la 
cadena
temporal, pero...

Cuando reemplazo en el main() las lineas antes mencionadas por estas otras:

	// verifica el operador sobrecargado +
	// c1 = mortisaranga,  c2 = matachilanga
	Cadena c33 = c1 + c2;
	cout << "c33 arroja = " << c33 << "\n";

La corrida resulta:

Constructor de Conversion: 0x77fda0 - mortisaranga matachilanga
c33 arroja = mortisaranga matachilanga


Pregunta: ¿a donde se fue el destructor?, si se supone que la cadena
temporal en donde se almacenaba c1 + c2 ya hizo su trabajo cuando le
fue asignada a c33, ¿porque esa cadena temporal no se destruye?,
como si sucedio en el caso anterior, luego de que la cadena temporal
fue impresa en pantalla.

Bueno, espero no caer pesado con tanto detalle.

Como siempre, que Dios los bendiga y gracias de antemano


Rodolfo

_________________________________________________________________
Consigue aquí las mejores y mas recientes ofertas de trabajo en América 
Latina y USA: http://latam.msn.com/empleos/





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