[C con Clase] Extraño comportamiento de destructor

Ferran Ferri ferranferri en gmail.com
Dom Oct 11 01:56:22 CEST 2009


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




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