Inicio > Informática > Singletons en c++: el problema de la destrucción

Singletons en c++: el problema de la destrucción

septiembre 28, 2010 Deja un comentario Go to comments

Posts sobre cómo implementar el patrón de diseño Singleton en c++ hay cientos, pero la mayoría obvian o ignoran algo muy importante: la destrucción del Singleton.

Normalmente no suele haber problemas por no destruir un singleton al finalizar el programa; esto no es un memory leak. Sin embargo, si el Singleton mantiene recursos abiertos como sockets o ficheros (un Singleton de Log, por ejemplo), dejar el descriptor abierto puede causarnos problemas. Por otro lado, si usamos un depurador de memoria como valgrind, nos avisará de que dejamos memoria sin liberar, lo cual puede ser un problema si estos mensajes se mezclan con memory-leaks reales.

Por tanto, para asegurar la destrucción del singleton, debemos utilizar la función atexit(void(*)()), para que llame a la función de destrucción del singleton al terminar la ejecución. El singleton quedaría de la siguiente manera:


class Singleton {
    private:
        static Singeton* pInstance_;
        // Delete the singleton instance
        static void DestroySingleton(){
            if(pInstance_ != NULL) delete pInstance_;
        }
        // Private to ensure single instance
        Singleton(){};
        Singleton(const Singleton& s){};
    public:
        virtual ~Singeton(){};

        static Singeton& getInstance() {
            if(pInstance_ == NULL)
            {
                pInstance_ = new Singeton();
                atexit(&DestroySingleton);    // At exit, destroy the singleton
            }
            return *pInstance_;
        }
};
Singeton* Singleton::pInstance_ = NULL;

Aunque con alguna variación, esta elegante solución está extraída del libro de Andrei Alexandrescu: Modern C++ Design: Generic Programming and Design Patterns Applied. Sinceramente, el mejor libro de programación que he leído nunca.

Categorías:Informática Etiquetas: ,
  1. febrero 17, 2011 a las 1:35 pm

    Muy buena entrada. Con tu permiso la enlazo a un post que tengo en mi blog que hablaba sobre los patrones singleton😉.

  2. elitepep
    mayo 28, 2011 a las 11:58 pm

    tengo que ponerme las pilas estoy perdido entre clases objetos y todo esto viva Ogre y él que lo diseño. singleton for ever.

  3. diciembre 14, 2012 a las 7:53 am

    Muchísimas gracias!

  4. febrero 4, 2013 a las 10:24 pm

    Muy interesante aprender pequeños detalles en cosas que usamos con asiduidad.

  5. noviembre 5, 2013 a las 9:59 am

    Muchas gracias, estaba implementándolo en Qt y necesitaba un ejemplo como el tuyo.

  1. febrero 17, 2011 a las 1:37 pm

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s