[C con Clase] Buenas tardes a todos. En relación a patrón Singleton en C++. Pregunta compleja.

Davidson, Steven srd4121 en njit.edu
Dom Jul 13 20:23:38 CEST 2014


Hola Miguel Ángel,

2014-07-13 6:13 GMT-04:00 Miguel Ángel Torres Fernández-Píñar <
miguelangeltorresfp en gmail.com>:

> Muchas gracias Borja por tu respuesta. Sé que estos son temas complejos y
> mi nivel de C++ es bastante bajo.
>
> Parece que ya funciona.
>
> Hay una cosa que no entiendo en el ejemplo de
> http://caymcorp.wordpress.com/2010/09/28/singletons-en-c-el-problema-de-la-destruccion/
>
> Para qué se usa esto :
>
> public:
>             virtual ~SingletonManagers(){};
>
>
Esto sirve para crear una clase virtual, de la que se puede derivar y así
usar objetos polimórficos de la clase base, 'Singleton'.

Se supone que el destructor que se llama automáticamente con :
> atexit(&DestroySingleton);    // At exit, destroy the singleton
>
>
Sí, pero 'DestroySingleton()' invocará implícitamente a su destructor,
'~Singleton()'.

es :
>
> // Delete the singleton instance
>             static void DestroySingleton()
>             {
>                 if(pInstance_ != NULL) delete pInstance_;
>

Aquí se invocará al destructor, '~Singleton()'.

            }
>
>
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.

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.

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.


Espero que esto te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20140713/ac4f6561/attachment.html>


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