<div dir="ltr"><div><div><div>Muchas gracias Steven, ya veo que sigues al pie del cañón como siempre.<br><br></div>Al final he usado este modelo aunque estuve pensando en usar punteros inteligentes ( uso la librería de mi profe que tiene incorporada una clase para manejar punteros inteligentes ). <br>
<br>        <span style="color:rgb(61,133,198)">class SingletonManagers <br>        {<br><br>        public:<br>            static SingletonManagers& getInstance()<br>            {<br>                static SingletonManagers instance;<br>
                return instance;<br>            }<br>        private:<br>            SingletonManagers() {}<br>            SingletonManagers(SingletonManagers const&);// Don't Implement.<br>            void operator=(SingletonManagers const&);// Don't implement<br>
 <br>        public:<br>            //Referencia al manager principal<br>            App_Main_Manager* app_main_manager;<br><br>        };</span><br><br></div>Es otra alternativa que recomiendan por ahí para solucionar estos problemas.<br>
<br></div><div>Aunque realmente el problema lo tenía principalmente para poder guardar una referencia a la clase "App_Main_manager".<br></div><div>Es que esta clase implementa un loop. Al cerrar de manera forzada la aplicación invoca un método propio "halt()", y ahí, en ese método, tuve que poner :<br>
<br><span style="color:rgb(61,133,198)">    //Se invoca cuando se interrumpe la aplicación bruscamente<br>    void App_Main_Manager::halt()<br>    {<br>        cout << "halt" << endl;<br>        SingletonManagers::getInstance().app_main_manager = null;<br>
    }</span><br><br></div><div>Y con eso ya se puede cerrar la aplicación sin que de problemas.<br><span style="color:rgb(153,0,0)"><br></span></div><div><span style="color:rgb(153,0,0)">Ah, Steven, no entendí muy bien lo de :<br>
<br> virtual ~SingletonManagers(){};<br><br></span></div><div><span style="color:rgb(153,0,0)">Pensé que era un destructor por el simbolito que tiene delante.</span><br></div><div><br></div><div>Gracias por vuestra ayuda.<br>
</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">El 13 de julio de 2014, 20:23, Davidson, Steven <span dir="ltr"><<a href="mailto:srd4121@njit.edu" target="_blank">srd4121@njit.edu</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hola Miguel Ángel,<br><div class="gmail_extra"><br><div class="gmail_quote">2014-07-13 6:13 GMT-04:00 Miguel Ángel Torres Fernández-Píñar <span dir="ltr"><<a href="mailto:miguelangeltorresfp@gmail.com" target="_blank">miguelangeltorresfp@gmail.com</a>></span>:<div class="">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><div><div>Muchas gracias Borja por tu respuesta. Sé que estos son temas complejos y mi nivel de C++ es bastante bajo.<br>

<br>Parece que ya funciona.<br><br>Hay una cosa que no entiendo en el ejemplo de  <a href="http://caymcorp.wordpress.com/2010/09/28/singletons-en-c-el-problema-de-la-destruccion/" target="_blank">http://caymcorp.wordpress.com/2010/09/28/singletons-en-c-el-problema-de-la-destruccion/</a><br>


<br></div>Para qué se usa esto :<br><br>public:<br>            virtual ~SingletonManagers(){};<br><br></div></div></div></blockquote><div><br></div></div><div>Esto sirve para crear una clase virtual, de la que se puede derivar y así usar objetos polimórficos de la clase base, 'Singleton'.</div>
<div class="">
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div><div></div>Se supone que el destructor que se llama automáticamente con :<br>

atexit(&DestroySingleton);    // At exit, destroy the singleton <br>
<br></div></div></blockquote><div><br></div></div><div>Sí, pero 'DestroySingleton()' invocará implícitamente a su destructor, '~Singleton()'.</div><div class=""><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div dir="ltr"><div></div>es :<br><div><br>// Delete the singleton instance<br>            static void DestroySingleton()<br>            {<br>                if(pInstance_ != NULL) delete pInstance_;<br></div></div></blockquote>

<div><br></div></div><div>Aquí se invocará al destructor, '~Singleton()'.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div dir="ltr"><div>            }<br><br></div></div></blockquote><div><br></div><div>Debo agregar que el uso de 'atexit()' puede ser peligroso para este tipo de problemas, ya que no garantiza el orden correcto de la destrucción de los objetos. En el código que usas, se invoca 'atexit()' dentro de 'getInstance()' para asegurar que se registre primero la función de destrucción.</div>

<div><br></div><div>De todas maneras, sugiero usar punteros inteligentes. En la versión actual de C++, que a veces se llama C++11, puedes usar la plantilla-clase, 'shared_ptr', si quieres permitir el compartir entre punteros, o 'unique_ptr', si no quieres permitirlo. De esta manera, usas un objeto que contiene el puntero al objeto 'Singleton', por lo que al destruirse tal objeto, se invocará su destructor.</div>

<div><br></div><div>La idea tras los punteros inteligentes es usar un objeto que contiene el puntero y no tener que manipular punteros directamente. Así reducimos la probabilidad de provocar fugas de memoria al usar punteros directamente.</div>

<div><br></div><div><br></div><div>Espero que esto te oriente.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Steven</div><div><br></div></font></span></div></div></div>
<br>_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br></blockquote></div><br></div>