一、一般的单例实现
class Helper : public QObject
{
private:
explicit Helper(QObject *parent = nullptr);
static Helper *_instance;
public:
static Helper *getInstance()
{
static QMutex mutex;
if (!_instance)
{
QMutexLocker locker(&mutex);
if (!_instance)
{
_instance = new Helper;
}
}
return _instance;
}
void process(void);
};
单例的调用方法:
Helper::getInstance()->process();
单例的释放方法:
>释放方法一:手动释放
delete Helper::getInstance();
>释放方法二:自动释放 (参考自:https://www.cnblogs.com/wxxweb/archive/2011/04/15/2017088.html)
利用程序在结束的时候,系统会自动析构所有类的静态成员变量这项特性,在类中增加一个用于自动释放的类
于是改良后:
class Helper : public QObject
{
private:
explicit Helper(QObject *parent = nullptr);
static Helper *m_pInstance;
class HelperRelease //定义一个只实现析构函数的类
{
public:
~HelperRelease()
{
if (Helper::m_pInstance)
{
delete Helper::m_pInstance;
}
}
};
static HelperRelease m_pHelperRelease; //定义一个静态成员,在程序结束时,系统会调用它的析构函数
public:
static Helper *getInstance(void)
{
static QMutex mutex;
if (!m_pInstance)
{
QMutexLocker locker(&mutex);
if (!m_pInstance)
{
m_pInstance= new Helper;
}
}
return m_pInstance;
}
void process(void);
};
那么这样单例就会在程序结束时自动释放,不用担心自己忘记了手动使用delete Helper::getInstance();来释放资源。
二、一个不用new的创建单例方法
1.返回对象
class Helper : public QObject
{
public:
static Helper& getInstance(void)
{
static Helper s_instance;
return s_instance;
}
};
2.返回对象指针
class Helper : public QObject
{
public:
static Helper* getInstance(void)
{
static Helper s_instance;
return &s_instance;
}
};
连释放都不需要自己做了,也是比较推荐的简单方法。
三、使用Q_GLOBAL_STATIC创建全局静态对象
宏的官方介绍:https://doc.qt.io/qt-5/qglobalstatic.html
1.头文件
#include <QGlobalStatic>
class Helper : public QObject
{
public:
static Helper* getInstance(void);
};
2.源文件
Q_GLOBAL_STATIC(Helper, helper)
Helper *Helper::instance()
{
return helper();
}