转载 https://blog.csdn.net/m0_71489826/article/details/142288179
前言
本文主要写Q_GLOBAL_STATIC
实现单例以及单例的释放,网上很多教程只有单例的创建,但是并没有告诉我们单例的内存管理,这就很头疼。
正文
使用 Qt 的 Q_GLOBAL_STATIC
cpp
// Singleton.h
#ifndef SINGLETON_H
#define SINGLETON_H
#include <QWidget>
#include <qscopedpointer.h>
QT_BEGIN_NAMESPACE
namespace Ui { class Singleton; }
QT_END_NAMESPACE
class Singleton : public QWidget
{
Q_OBJECT
public:
static Singleton* getInstance();
// 注意这里构造函数不能设为私有,要不然宏访问不了。
// 或者你设为私有,将QGlobalStatic设为友元
Singleton(QWidget *parent = nullptr);
~Singleton();
private:
// 禁止拷贝构造和赋值操作
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
Ui::Singleton *ui;
};
#endif // SINGLETON_H
// Singleton.cpp
#include "singleton.h"
#include "ui_singleton.h"
#include "qdebug.h"
#include <QGlobalStatic> //需要添加这个头文件
// 使用 Q_GLOBAL_STATIC 宏定义全局单例对象
Q_GLOBAL_STATIC(Singleton, globalSingletonInstance)
Singleton *Singleton::getInstance()
{
return globalSingletonInstance;
}
Singleton::Singleton(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Singleton)
{
ui->setupUi(this);
qDebug()<<"单例创建成功";
}
Singleton::~Singleton()
{
qDebug()<<"单例安全销毁";
delete ui;
}
解释:
Q_GLOBAL_STATIC
是 Qt 提供的宏,用于创建全局静态单例对象,自动处理线程安全问题,宏定义一个静态变量,不需要我们管理内存问题,适合在 Qt 程序中使用。
使用
cpp
void UseSingleton::on_pushButton_clicked()
{
instance = Singleton::getInstance();
instance->show();
}
运行结果
点击创建按钮,单例被创建,窗口被关闭时单例并不会被销毁,因为静态变量的生命周期和程序是一样的,只有关闭程序单例才会被销毁。
内存管理
使用这个宏来实现单例我觉得就是静态变量实现单例是一样的,不需要内存管理