Qt:Q_GLOBAL_STATIC实现单例(附带单例使用和内存管理)

转载 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();
}
运行结果

点击创建按钮,单例被创建,窗口被关闭时单例并不会被销毁,因为静态变量的生命周期和程序是一样的,只有关闭程序单例才会被销毁。

内存管理

使用这个宏来实现单例我觉得就是静态变量实现单例是一样的,不需要内存管理

小结

相关推荐
珹洺18 小时前
Java-Spring入门指南(二十二)SSM整合前置基础
java·开发语言·spring
ʚ希希ɞ ྀ18 小时前
用队列实现栈---超全详细解
java·开发语言·数据结构
郝学胜-神的一滴18 小时前
Python中的鸭子类型:理解动态类型的力量
开发语言·python·程序人生·软件工程
猫头虎19 小时前
如何解决 pip install -r requirements.txt extras 语法 ‘package[extra’ 缺少 ‘]’ 解析失败问题
开发语言·python·开源·beautifulsoup·virtualenv·pandas·pip
zhangfeng113319 小时前
R语言 读取tsv的三种方法 ,带有注释的tsv文件
开发语言·r语言·生物信息
eqwaak019 小时前
动态图表导出与视频生成:精通Matplotlib Animation与FFmpeg
开发语言·python·ffmpeg·音视频·matplotlib
刘新明198919 小时前
Frida辅助分析OLLVM虚假控制流程(下)
java·开发语言·前端
第二只羽毛20 小时前
重载和继承的实践
java·开发语言
光军oi20 小时前
全栈开发杂谈————JAVA微服务全套技术栈详解
java·开发语言·微服务
帮帮志20 小时前
目录【系列文章目录】-(关于帮帮志,关于作者)
java·开发语言·python·链表·交互