[C con Clase] Extraño comportamiento de destructor

Rolando Kindelan Nuñez rkindelan en uci.cu
Vie Oct 16 03:06:07 CEST 2009


Lo que sucede es que haces esto: CGeneralLogger glogger =
CGeneralLogger("Log333.txt",tools::GLog::LOGLEVEL_DEGUG);

en realidad lo que está ocurriendo es que creas un objeto CGeneralLogger que copias al objeto glogger (ya llevas 2 CGeneralLogger), pero como después de la copia el 1ero sale de ámbito se destruye (se llama el destructor).... y al finalizar el main se destruye el otro CGeneralLogger (glogger) porque ha salido de ámbito y cdo esto ocurre el destructor se llama automáticamente.

saludos.


"pensar en el futuro hace el presente más complicado..." 

  Rolando . 

----- Mensaje original -----
De: "Ferran Ferri" <ferranferri en gmail.com>
Para: "Lista de correo sobre C y C++" <cconclase en listas.conclase.net>
Enviados: Sábado, 10 de Octubre 2009 16:56:22 GMT -08:00 Tijuana / Baja California
Asunto: [C con Clase] Extraño comportamiento de destructor

Hola a todos.
Estoy haciendo una clase que usa un Log para guardar mensajes. Lo
extraño es que tal como se crea la clase, automaticamente se llama al
destructor. El codigo del main es este:
====================================================

int main(int argc, const char* argv[]){
	//Aqui creo un logger
	CGeneralLogger glogger =
CGeneralLogger("Log333.txt",tools::GLog::LOGLEVEL_DEGUG);

        // Aqui recojo una instancia del singleton GlobalLogger
	tools::GLog::CGlobalLog *gLog;
	gLog = tools::GLog::CGlobalLog::getInstance();
	gLog->setMinimumLogLevel(tools::GLog::LOGLEVEL_DEGUG);

        // Aqui agrego la clase al log para que la llame en processMessage.
	gLog->addListener(&glogger);
	gLog->addMessage("Inicio del Log", "[GLOBAL]",tools::GLog::LOGLEVEL_DEGUG);

        //Aqui se llama a la funcion virtual para escribir los
mensajes a los listeners.
	gLog->processMessages();
	cout << "Hola mundo" << endl;
	system("PAUSE");
	return EXIT_SUCCESS;
}
====================================================

El del constructor es este:
====================================================
CGeneralLogger::CGeneralLogger(std::string fileName,
tools::GLog::LogLevel lvl):m_fileName(fileName), m_level(lvl)
{
	m_file = new std::ofstream;
	m_file->open(m_fileName.c_str(), std::ios_base::out |std::ios_base::app);
	tools::GLog::CGlobalLog *log;
	log = tools::GLog::CGlobalLog::getInstance();
}
====================================================

Y el del destructor es este:
====================================================
CGeneralLogger::~CGeneralLogger(void)
{
	*m_file << "closing file" << std::endl;
	m_file->close();
}
====================================================

Y el codigo en addListener, es este:
====================================================
		void CGlobalLog::addListener( IListener* listener, std::string
loggerGroup /*= "[GLOBAL]"*/ )
		{
			std::pair<t_ListenerVectorMap::iterator,bool> p =
			listenerVectorMap.insert(std::pair<std::string,t_ListenerVector*>(loggerGroup,new
t_ListenerVector()));
			p.first->second->push_back(listener);
		}
====================================================

Mis sospechas son que en algun sitio de las STL que uso en addListener
provocan algun tipo de constructor que lleva a una llamada al
destructor del objeto. Ademas, una vez se acaba el main, tambien se
llama al destructor. Por otro lado, si declaro el destructor como
virtual se produce una tercera llamada al destructor.

La verdad es que ando bastante perdido. Si me podeis echar una mano os
lo agradeceria muchisimo.
Ferran

_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ




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