当前位置: 首页 > article >正文

Qt:饿汉单例(附带单例使用和内存管理)

前言

本文主要写饿汉单例以及单例的释放,网上很多教程只有单例的创建,但是并没有告诉我们单例的内存管理,这就很头疼。

正文

饿汉式单例

// SingletonClass.h
#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 // SINGLETONCLASS_H


// SingletonClass.cpp
#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()<<"单例的销毁";
}

解释:

  • 饿汉式单例在程序启动时就创建实例,保证线程安全,适合需要频繁访问单例对象的场景。

使用

使用的正常的单例使用一样,可以参考我写的另一篇文章的使用

// 在UseSingleton类中的槽函数中添加
void UseSingleton::on_pushButton_clicked()
{
    SingletonClass* ins = SingletonClass::getInstance();
    /*
        其它处理逻辑
    */
    // 销毁单例
    ins->destorySingleton();
}

运行结果

这样,刚启动程序的时候单例就会创建,当点击按钮的时候,单例就会被销毁。
在这里插入图片描述

内存管理

这里内存管理应该是只有两种方法了,一种是像我文中一样自己写一个单例的释放函数,还有一种自然就是使用智能指针了,这两种方法我在懒汉单例里面都有,这里就不写了。

注意

如果你的单例是继承自QWidget,那么你写饿汉单例的时候,尤其是new对象的时候大概率会报错,因为在类加载时直接创建单例实例;会导致QWidget先于QApplication创建,这个是不可以的。

小结

如有错误请指正。


http://www.kler.cn/a/306694.html

相关文章:

  • python LangChain RecursiveCharacterTextSplitter 使用参数解释
  • 【笔记】自动驾驶预测与决策规划_Part6_不确定性感知的决策过程
  • day57 图论章节刷题Part08(拓扑排序、dijkstra(朴素版))
  • pg_dump -Fc 导出的自定义格式数据库文件 相关操作
  • 独显装完ubuntu后启动黑屏显示/dev/sda:clean files blocks的解决方案
  • C语言中的信号量semaphore详解
  • Redis 的数据持久化
  • Ajax 使用流程详解
  • WLS2(ubuntu22.04)使用windows2的代理上网
  • 深度学习速通系列:混淆矩阵是什么
  • 获取无人机经纬度是否在指定禁飞区内
  • Hadoop如何进行分布式存储和处理大数据?
  • 大数据新视界 --大数据大厂之数据科学项目实战:从问题定义到结果呈现的完整流程
  • 【git】本地项目多版本解决冲突 vscode
  • 基于vue框架的宠物交流平台1n2n3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 指标服务平台:全面解析
  • 如何删除git提交记录
  • Unity中InputField一些属性的理解
  • King3399 SDK编译简明教程
  • unocss 一直热更新打印[vite] hot updated: /__uno.css
  • 如何将Git本地代码推送到Gitee云端仓库
  • 优化 TCP 以提高网络性能
  • 每日一题——第八十八题
  • 指定聚类中心的聚类算法实现
  • [Golang] Channel
  • Sourcetree安装教程及使用