前言
本文主要写饿汉单例以及单例的释放,网上很多教程只有单例的创建,但是并没有告诉我们单例的内存管理,这就很头疼。
正文
饿汉式单例
#ifndef SINGLETONCLASS_H
#define SINGLETONCLASS_H
#include <QObject>
class SingletonClass: public QObject
{
public:
static SingletonClass* getInstance();
static void destorySingleton();
private:
SingletonClass();
SingletonClass(const SingletonClass&) = delete;
SingletonClass& operator=(const SingletonClass&) = delete;
~SingletonClass();
private:
static SingletonClass* instance;
};
#endif
#include "singletonclass.h"
#include "qdebug.h"
SingletonClass* SingletonClass::instance = new SingletonClass();
SingletonClass *SingletonClass::getInstance()
{
return instance;
}
void SingletonClass::destorySingleton()
{
if (instance) {
delete instance;
instance = nullptr;
}
}
SingletonClass::SingletonClass()
{
qDebug()<<"单例的创建;";
}
SingletonClass::~SingletonClass()
{
qDebug()<<"单例的销毁";
}
解释:
- 饿汉式单例在程序启动时就创建实例,保证线程安全,适合需要频繁访问单例对象的场景。
使用
使用的正常的单例使用一样,可以参考我写的另一篇文章的使用
void UseSingleton::on_pushButton_clicked()
{
SingletonClass* ins = SingletonClass::getInstance();
ins->destorySingleton();
}
运行结果
这样,刚启动程序的时候单例就会创建,当点击按钮的时候,单例就会被销毁。
内存管理
这里内存管理应该是只有两种方法了,一种是像我文中一样自己写一个单例的释放函数,还有一种自然就是使用智能指针了,这两种方法我在懒汉单例里面都有,这里就不写了。
注意
如果你的单例是继承自QWidget,那么你写饿汉单例的时候,尤其是new对象的时候大概率会报错,因为在类加载时直接创建单例实例;会导致QWidget先于QApplication创建,这个是不可以的。
小结
如有错误请指正。