文章目录

  • 前言
  • QSharedPointer
  • 值得一提

前言

Qt智能指针QSharedPointer 与 C++中的std::shared_ptr其作用是一样的,其应用范围比我们前面说到的QPointer和QScopedPointer更广。

QSharedPointer

QSharedPointer 是一个共享指针,它与 QScopedPointer 一样包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,也就是说,与QScopedPointer不同的是,QSharedPointer可以被自由地拷贝和赋值,在任意的地方共享它,所以QSharedPointer也可以用作容器元素。

所谓的计数型指针,就是说在内部QSharedPointer对拥有的内存资源进行引用计数,比如有3个QSharedPointer同时指向一个内存资源,那么就计数3,知道引用计数下降到0,那么就自动去释放内存啦。

需要注意的是:QSharedPointer 是线程安全的,因此即使有多个线程同时修改 QSharedPointer 对象也不需要加锁。虽然 QSharedPointer 是线程安全的,但是 QSharedPointer 指向的内存区域可不一定是线程安全的。所以多个线程同时修改 QSharedPointer 指向的数据时还要应该考虑加锁。

先来看一个官方示例:

 static void doDeleteLater(MyObject *obj){obj->deleteLater();}void otherFunction(){QSharedPointer<MyObject> obj =QSharedPointer<MyObject>(new MyObject, doDeleteLater);// continue using objobj.clear();    // calls obj->deleteLater();}

这个示例中,传入了一个函数,用于自定义删除。

也可以直接使用成员函数:

QSharedPointer<MyObject> obj =QSharedPointer<MyObject>(new MyObject, &QObject::deleteLater);

QSharedPointer使用非常方便,直接和普通指针用法一样,创建后直接用,后面就不用管了。

再来看一个自己写的简单示例:

class Student : public QObject
{Q_OBJECT
public:Student(QObject * parent = nullptr);~Student();
};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();
private:QSharedPointer<Student> m_pStudent;};
#include "widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent)
{qDebug() << __FUNCTION__;m_pStudent = QSharedPointer<Student>(new Student());
}Widget::~Widget()
{qDebug() << __FUNCTION__;
}Student::Student(QObject *parent):QObject (parent)
{qDebug() << __FUNCTION__;
}Student::~Student()
{qDebug() << __FUNCTION__;
}

运行后关闭窗口,输出:

Widget
Student
~Widget
~Student

可以看到,student对象被自动释放了。

值得一提

我们都知道Qt的QObject对象树系统(父子),当在创建对象时如果指定了父对象,那么该对象就无需手动释放,会由父对象去做资源回收。我在查询智能指针相关资料的时候,看到一篇文章,介绍智能指针和QObject对象树系统结合使用的时候,程序会崩溃,文章在这里,不过这是六年前的博客了。我尝试了一下,结果并没有出现崩溃的情况:

还是上面的示例,改动如下:

m_pStudent = QSharedPointer<Student>(new Student(this));

在new的时候指定了父对象

运行过后关闭窗口,很正常。我使用的是Qt5.11.1

说明,这些年Qt的更新解决了这个问题。那么我们在用的过程中就可以少些顾虑了,放心使用。

OK,更多文档说明,参考官方介绍

Qt智能指针--QSharedPointer相关推荐

  1. Qt智能指针--QWeakPointer

    文章目录 概述 QWeakPointer 示例 概述 前面我们说到的QSharedPointer是一个强引用类型的智能指针,而QWeakPointer是一个弱引用类型的智能指针,和C++中的weak_ ...

  2. Qt智能指针--QScopedPointer

    文章目录 概述 QScopedPointer const 限制 考虑一种情况 QScopedArrayPointer 概述 前一篇文章我们详细的介绍了QPointer的用法,那么,这里继续总结Qt的另 ...

  3. Qt 之 智能指针汇总

    来源 还有其他一些,做了一些汇总和测试,就不全列了. 文章目录: 一.垂悬指针的问题 二.Qt中的智能指针        1.QPointer        2.QSharedPointer & ...

  4. Qt源码剖析-智能指针

    目录 智能指针是什么? 为什么使用QT智能(smart)指针? Qt提供了哪些智能指针? QSharedPointer类模板(smart指针类)源码分析 1. QSharedPointer类模板对于模 ...

  5. qt 如何 指针 自动 释放内存_要是面试官再问你智能指针的问题,就拿这篇文章“盘他”!!!...

    前一段时间,有不少朋友问我关于智能指针的问题,并且反映经常会在面试中被面试官问到,所以今天小豆君就来讲讲我对智能指针的理解,希望能对大家有所帮助 既然讲智能指针,我们就先来看看它为什么会出现. 1 传 ...

  6. 【QT小记】QT中智能指针的使用

    自定义两个类 class OnePiece { public:OnePiece() {qDebug() << QString("构造OP");}~OnePiece() ...

  7. Linux 内核里的“智能指针”【转】

    转自:http://blog.jobbole.com/88279/ 众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异 ...

  8. Linux 内核里的“智能指针”

    Linux 内核里的"智能指针" from: http://begeek.cn/post/7889.html?ref=myread 众所周知,C/C++语言本身并不支持垃圾回收机制 ...

  9. 61、智能指针类模板

    1.智能指针 智能指针的意义 - 现代C++开发库中最重要的类模板之一 - C++中自动内存管理的主要手段 - 能在很大程度上避开内存相关的问题 STL中的智能指针 auto_ptr(#include ...

最新文章

  1. 史上最全的长读长数据校错方法大比拼
  2. Gradle 的使用
  3. 005_Java操作ZooKeeper
  4. vscode 最好的ui主题
  5. 8.2.2继承 第8章 面向对象编程简介
  6. python实现logistic_使用python实现logistic二分类
  7. [爬虫][python][入门][网页源码][百度图片][豆瓣TOP250]
  8. 基于深度学习的番茄叶片分割算法在手机上的应用(GDL+复杂背景只分割叶片有意义?)
  9. Craking the Interview-1
  10. mysql的读写分离技术_mysql 读写分离方法
  11. Windows 2008 Domain Controller
  12. c语言 多进程实现基于UDP的网络群聊聊天室
  13. word打印高清图片
  14. 抗议浪潮不断,峰会笑声阵阵
  15. iOS 5 故事板进阶(1)
  16. 机器学习在网络安全领域的应用(二)
  17. 人工智能,机器学习与深度学习,到底是什么关系
  18. HDR阴影高光图像增强
  19. 第二届云计算大会暨大数据高峰论坛举办
  20. 丑哥哥工作室官方网站开通啦

热门文章

  1. 算法模型该如何解释?
  2. 谁在为网易云音乐2亿用户的即时通讯保驾护航?
  3. 也说说TIME_WAIT状态
  4. vue适配移动端px自动转化为rem
  5. centos 安装配置ftp服务器
  6. RequiredFieldValidator----验证控件不起作用
  7. V-rep学习笔记:vrep中的实用工具
  8. IdentityServer4 实现 OpenID Connect 和 OAuth 2.0
  9. PHP XML和数组互相转换
  10. sql语句的一些参考