template<class T>
class SingletonTemplate
{
public:
static T *getInstance();
static void freeInstance();
protected:
SingletonTemplate(){}
~SingletonTemplate(){}
private:
SingletonTemplate(const SingletonTemplate&);
SingletonTemplate &operator=(const SingletonTemplate&);
private:
static QMutex m_cMutex; //线程锁
static T *m_pInstance; //单例对象
};
//定义 初始化 单例信息
template<class T>
QMutex SingletonTemplate<T>::m_cMutex;
template<class T>
T *SingletonTemplate<T>::m_pInstance = nullptr;
template<class T>
T *SingletonTemplate<T>::getInstance()
{
if (!m_pInstance)
{
QMutexLocker qMLocker(&m_cMutex); //线程安全,加个锁
if (!m_pInstance)
{
m_pInstance = new T();
::atexit(freeInstance); //注册终止函数
}
}
return m_pInstance;
}
template<class T>
void SingletonTemplate<T>::freeInstance()
{
if (!m_pInstance)
{
QMutexLocker qMLocker(&m_cMutex); //线程安全,加个锁
if (!m_pInstance)
{
delete m_pInstance; //释放单例
m_pInstance = nullptr;
}
}
}