单例模式存在两个弊端:
1:资源泄漏:实例必须在合适的时候释放。GetInstance,ReleaseInstance
2:线程安全:此问题一定要注意,本人今天就吃了单例模式线程安全的亏,可以用下列方式解决:
CTotalSolve *CTotalSolve::GetInstance()
{
if(m_pInstance == NULL)
{
CTotalSolve *pTemp = new CTotalSolve();
InterlockedCompareExchangePointer((PVOID *)&m_pInstance, pTemp, NULL);
if(m_pInstance != pTemp)
{
delete pTemp;
}
}
return m_pInstance;
}
VOID CTotalSolve::ReleaseInstance()
{
if(m_pInstance != NULL)
{
CTotalSolve *pTemp = static_cast<CTotalSolve *>(InterlockedExchangePointer((PVOID *)&m_pInstance, NULL));
if(pTemp != NULL)
{
delete pTemp;
}
}
}
为了解决内存泄露的定位,可以在stdafx.h文件的末尾加入:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif // _DEBUG
但是使用了STL的文件不能这么处理,因为他们都重载了new运算符,可以在相应应用文件使用下列方式解决:
#ifdef new
#undef new
#define new new
#endif // new
#include <vector>
using namespace std;
#ifdef new
#undef new
#define new DEBUG_NEW
#endif // new