Re: A few questions about singletons...
On 24 sep, 23:03, "Somebody" <someb...@cox.net> wrote:
So, I've been programming for 16 yrs in C++ and it seems like all the OO
interviews these days think you need to know design patterns to be a good
(or even decent) programmer :p. What ya gonna do eh? :)...
Anyways, this is what I have for my singleton class.
Some classify singleton as an anti-pattern. It has been too much
confused with globals (IMO particularly in C++ because of the idiom
solving the initialisation order issue).
class CSingleton
{
protected:
CSingleton()
{
printf("CSingleton()\n");
}
~CSingleton()
{
printf("~CSingleton()\n");
}
static CSingleton* m_pInst;
public:
static CSingleton* GetInstance()
{
if (m_pInst == NULL)
m_pInst = new CSingleton;
return m_pInst;
}
};
CSingleton* CSingleton::m_pInst = NULL;
IIRC, you have implemented the Gamma singleton; it has a number of
pitfall you may search on internet.
[snip]
Works fine... except...
1) what is the interview approved way to clean up the created object? Hav=
ing
a static "clean up" method that the user is responsible for calling seems
completely retarded and anti-encapsulation. I've seen some solutions that
create a second CSingletonDestroyer class as static and pass in the point=
er.
Then when the CSingletonDestroyer class is killed naturally, it kills the
CSingleton...
You can use a Meyer singleton which solve the initialisation order
issue:
static CSingleton& GetInstance()
{
CSingleton static_instance;
return static_instance;
}
And the cleanup is made at termination. The cleanup of a singleton is
delicate because you don't known how is currently using it (it is even
worse when in a DLL); you should let the system decide when it is no
longer needed.
2) but the CSingletonDestroyer() class brings up thread safeness issues..=
..
if I wrap my GetInstance() in a critical section how does the critical
section get initialized and cleaned up? I guess I can use a mutex, which
will solve the init problem since that can be static init'ed, but wheres =
the
clean up?
Singleton in multithreading environment is a delicate matter. There is
currently no standard way of doing it reliably (except in the next C++
standard).
You may search "C++ and the Perils of Double-Checked Locking" for a
detailed explanation.
--
Michael