QT中的单例智能指针

86 篇文章 1 订阅

QT中的单例智能指针
1、首先创建一个客户类使用单例类。
头文件:
//--------------------------------------------------------------------------------------
#include
#include
#include
#include
class SingleSharePoint;
namespace Ui {
class Test;
}

class Test : public QMainWindow
{
Q_OBJECT

public:
explicit Test(QWidget *parent = 0);
~Test();

private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();

private:
Ui::Test *ui;
};
//--------------------------------------------------------------------------------------
cpp文件:
#include “test.h”
#include “ui_test.h”
Test::Test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Test)
{
ui->setupUi(this);

}

Test::~Test()
{
delete ui;
}

void Test::on_pushButton_clicked()
{
SingleSharePoint::GetInstance(); //实例化
}

void Test::on_pushButton_2_clicked()
{
SingleSharePoint::destroy();//手动释放智能指针
}
//--------------------------------------------------------------------------------------

第二步创建单例智能指针。
头文件:
//--------------------------------------------------------------------------------------
class SingleSharePoint : public QObject
{
Q_OBJECT

private:
SingleSharePoint();
// ~SingleSharePoint();
static QSharedPointer p_Instance; // 定义为智能指针
static QMutex m_mutex;
static void deletepointr(SingleSharePoint *obj);

public:
static SingleSharePoint *GetInstance();
static void destroy();
};
//--------------------------------------------------------------------------------------
cpp文件:
//初始化
QMutex SingleSharePoint::m_mutex;
QSharedPointer SingleSharePoint::p_Instance;

SingleSharePoint::SingleSharePoint()
{

}

//私有化智能指针无法使用
//SingleSharePoint::~SingleSharePoint()
//{
// qDebug()<<“delete”;
//}

SingleSharePoint* SingleSharePoint::GetInstance()
{
//自动锁
QMutexLocker locker(&m_mutex);
if (p_Instance.isNull())
{
p_Instance = QSharedPointer(new SingleSharePoint,deletepointr); // 指定析构函数deletepointr
qDebug()<<“create”;
}
qDebug()<<“go”<<p_Instance;
}

//手动释放智能指针
void SingleSharePoint::destroy()
{
p_Instance.clear();
qDebug()<<“destroy”<<p_Instance;
}

// 智能指针指定的析构函数
void SingleSharePoint::deletepointr(SingleSharePoint* obj)
{
obj->deleteLater();
qDebug()<<“delete”;
}
//--------------------------------------------------------------------------------------
第三步 运行看结果,点击创建单例后,实例化一次。
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210316173751852.png在这里插入图片描述

第四步删除,点击释放后,删除一次。
在这里插入图片描述

不对的请各位指出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt智能指针主要有三种:QSharedPointer、QWeakPointer和QScopedPointer。它们都是用来管理动态分配的对象的指针,并且能够自动释放内存,避免内存泄漏。 1. QSharedPointer QSharedPointer是一个线程安全的智能指针,它允许多个指针共享同一个对象,并且能够在最后一个指针离开作用域时自动释放对象。以下是一个简单的示例: ```cpp QSharedPointer<QString> ptr1(new QString("Hello")); QSharedPointer<QString> ptr2 = ptr1; QSharedPointer<QString> ptr3 = ptr2; qDebug() << *ptr1; // 输出"Hello" qDebug() << *ptr2; // 输出"Hello" qDebug() << *ptr3; // 输出"Hello" ``` 2. QWeakPointer QWeakPointer是一个弱引用智能指针,它可以引用由QSharedPointer管理的对象,但不会增加对象的引用计数。当最后一个QSharedPointer离开作用域时,如果没有其他QSharedPointer引用该对象,则该对象被自动释放。以下是一个简单的示例: ```cpp QSharedPointer<QString> ptr1(new QString("Hello")); QWeakPointer<QString> weakPtr1 = ptr1; QWeakPointer<QString> weakPtr2 = weakPtr1; qDebug() << weakPtr1.data(); // 输出"Hello" qDebug() << weakPtr2.data(); // 输出"Hello" ptr1.clear(); qDebug() << weakPtr1.data(); // 输出nullptr qDebug() << weakPtr2.data(); // 输出nullptr ``` 3. QScopedPointer QScopedPointer是一个非共享的智能指针,它在离开作用域时自动释放对象。它不能被复制或共享,因此可以避免由于多个指针共享一个对象而引起的问题。以下是一个简单的示例: ```cpp QScopedPointer<QString> ptr(new QString("Hello")); qDebug() << *ptr; // 输出"Hello" ``` 以上是Qt三种智能指针的详细介绍及代码示例。使用智能指针可以避免内存泄漏和悬空指针等问题,提高代码的健壮性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方忘忧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值