Qt中使用单例getInstance()示例 (含自动释放方法)

6 篇文章 0 订阅

一、一般的单例实现

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(); 
}

 

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 是一个跨平台的应用程序开发框架,通过使用 C++ 编程语言和 Qt 库,开发者可以很方便地进行应用程序的开发。Qt 提供了一系列的线程类和同步机制,用于实现多线程编程。在多线程编程,为了保证共享资源的安全性,我们经常需要使用加锁的方式来进行同步操作。 单例模式是一种设计模式,在一个程序只能存在一个类的对象实例。Qt 单例模式通常用于全局共享资源的管理,比如日志记录器、数据库管理器等。 在 Qt 实现单例模式时,为了保证线程安全,我们需要加锁来控制多线程间对单例对象的访问。Qt 提供了 QMutex 类和 QMutexLocker 类用于加锁。 QMutex 是一个互斥量类,通过调用其 lock() 函数可以对资源加锁,这样其他线程就无法同时访问该资源。当线程完成对共享资源的操作后,需要调用 unlock() 函数来释放锁定。 使用 QMutex 加锁来实现单例模式的代码示例如下: ```cpp class Singleton { public: static Singleton* getInstance() { if (!m_instance) { QMutexLocker locker(&m_mutex); if (!m_instance) { m_instance = new Singleton(); } } return m_instance; } private: Singleton() {} static QMutex m_mutex; static Singleton* m_instance; }; QMutex Singleton::m_mutex; Singleton* Singleton::m_instance = nullptr; ``` 在 getInstance() 函数,首先判断 m_instance 是否为空,如果为空,则使用 QMutexLocker 对象锁定 m_mutex,并再次检查 m_instance 是否为空。这样可以确保多个线程同时调用 getInstance() 函数时只有一个线程能够创建单例对象。 通过使用 QMutex 加锁来实现单例模式,可以保证在多线程环境下单例对象的安全性,避免了多线程访问带来的竞争问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值