C++ QT智能指针的使用详解

 更新时间:2023年12月30日 10:36:55   作者:我不是程序猿儿  
这篇文章主要介绍了C++ QT智能指针的使用,Qt是一个跨平台的C++框架,主要用来开发图形用户界面程序,也可以开发不带界面的命令行程序,下面我们来了解QT智能指针是如何使用的

C++标准库中的三种智能指针

std::shared_ptr:使用引用计数,每一个shared_ptr的拷贝都指向相同的内存,每次拷贝都会触发引用计数+1,每次生命周期结束析构的时候引用计数-1,在最后一个shared_ptr析构的时候,内存才会释放。

std::weak_ptr:用来监视shared_ptr的生命周期,它不管理shared_ptr内部的指针,它的拷贝析构都不会影响引用计数,纯粹是作为一个旁观者监视shared_ptr中管理的资源是否存在,可以用来返回this指针和解决循环引用问题。

std::unique_ptr:独占型的智能指针,它不允许其它智能指针共享其内部指针,也不允许unique_ptr的拷贝和赋值。

Qt中的智能指针

QPointer,提供了指向QObject的保护指针

QPointer只能用于指向QObject及派生类的对象。当一个QObject或派生类对象被删除后,QPointer能自动    将其内部的指针设置为0,这样在使用QPointer之前就可以判断一下是否有效。QPointer对象超出作用域时,并不会删除它指向的内存对象。

  • QScopedPointer,和std::unique_ptr其概念是一样的
  • QSharedPointer,和std::shared_ptr其作用是一样的
  • QWeakPointer,和std::weak_ptr功能是一样的

一些名词:空指针,野指针,垂悬指针,无效指针

  • 空指针:指针值为NULL nullptr 0
  • 野指针:指针未初始化地址
  • 垂悬指针:指向已删除(或释放)的内存位置的指针称为悬空指针
  • 无效指针:指针指向内存的类型为void*,是一种特殊类型指针

使用Qt智能指针的设计需求通常涉及到以下几个方面:

  • 自动内存管理: 你希望确保在对象不再需要时能够自动释放其内存,避免内存泄漏。
  • 对象所有权的传递: 你希望在对象的所有权传递给其他部分时,能够方便地管理对象的生命周期。
  • 对象的共享所有权: 你希望多个部分能够共享同一个对象,而不需要手动跟踪引用计数或手动释放内存。
  • 异常安全: 你希望在发生异常时能够安全地释放资源,而不会导致资源泄漏。

示例:图形界面应用中的资源管理

一个图形界面应用,其中有一个文档对象,而文档对象中包含多个图形对象。每个图形对象可能有自己的资源,例如图像数据。你希望确保在文档对象或图形对象不再需要时,相关的资源能够被正确释放。

#include <QSharedPointer>
#include <QScopedPointer>
#include <QDebug>
// 假设的图形对象类
class GraphicObject {
public:
    GraphicObject() { qDebug() << "GraphicObject created"; }
    ~GraphicObject() { qDebug() << "GraphicObject destroyed"; }
    // 具体的图形对象操作
};
// 文档对象类
class Document {
public:
    Document() { qDebug() << "Document created"; }
    ~Document() { qDebug() << "Document destroyed"; }
    // 添加图形对象到文档
    void addGraphicObject(QSharedPointer<GraphicObject> graphicObject) {
        graphicObjects.append(graphicObject);
    }
    // 具体的文档操作
private:
    QList<QSharedPointer<GraphicObject>> graphicObjects;
};
int main() {
    // 使用 QSharedPointer 确保图形对象的自动释放
    QSharedPointer<GraphicObject> graphicObject(new GraphicObject);
    // 使用 QScopedPointer 确保文档对象的自动释放
    QScopedPointer<Document> document(new Document);
    // 将图形对象添加到文档
    document->addGraphicObject(graphicObject);
    // 注意:在这里,graphicObject 和 document 会在适当的时候自动释放
    return 0;
}

Document 类包含一个 QList,用于存储 QSharedPointer< GraphicObject >。这确保了在文档对象析构时,与其关联的所有图形对象也会被正确释放。同时,QScopedPointer 确保了 Document 对象本身在不再需要时能够被正确释放。

智能指针管理内存的一个关键特性:对象的生命周期与智能指针的生命周期绑定在一起

以上就是C++ QT智能指针的使用详解的详细内容,更多关于C++ QT智能指针的资料请关注脚本之家其它相关文章!

相关文章

  • C++ OpenCV学习之图像像素值统计

    C++ OpenCV学习之图像像素值统计

    在图像分析的时候,我们经常需要对单通道图像的像素进行统计。本文将主要介绍利用C++ OpenCV实现的图像像素值统计的几种方法,需要的可以参考一下
    2022-01-01
  • c语言中用位运算实现加法技巧介绍

    c语言中用位运算实现加法技巧介绍

    用位运算实现加法也就是计算机用二进制进行运算,32位的CPU只能表示32位内的数,这里先用1位数的加法来进行,需要的朋友可以参考下
    2012-11-11
  • C++实现公司人事管理系统

    C++实现公司人事管理系统

    这篇文章主要为大家详细介绍了C++实现公司人事管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 如何让Dev-C++支持auto关键字呢

    如何让Dev-C++支持auto关键字呢

    这篇文章主要介绍了如何让Dev-C++支持auto关键字问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • C语言实现页面置换算法(FIFO、LRU)

    C语言实现页面置换算法(FIFO、LRU)

    这篇文章主要介绍了通过C语言实现的两种页面置换算法:先进先出(FIFO)页面置换算法和最近最久未使用(LRU)页面置换算法。文中的代码具有一定的学习或工作价值,快来跟随小编学习一下吧
    2021-12-12
  • C语言实现数据的压缩与解压

    C语言实现数据的压缩与解压

    数据压缩是通过一系列的算法和技术将原始数据转换为更紧凑的表示形式,以减少数据占用的存储空间,数据解压缩则是将压缩后的数据恢复到原始的表示形式,本文给大家详细介绍了C语言实现数据压缩与解压,需要的朋友可以参考下
    2023-08-08
  • C++ txt 文件读取,并写入结构体中的操作

    C++ txt 文件读取,并写入结构体中的操作

    这篇文章主要介绍了C++ txt 文件读取,并写入结构体中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Linux系统下C语言gets函数出现警告问题的解决方法

    Linux系统下C语言gets函数出现警告问题的解决方法

    这篇文章主要给大家介绍了关于在Linux系统下C语言gets函数出现警告问题的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • 有关C++中类类型转换操作符总结(必看篇)

    有关C++中类类型转换操作符总结(必看篇)

    下面小编就为大家带来一篇有关C++中类类型转换操作符总结(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • 基于C语言实现的迷宫算法示例

    基于C语言实现的迷宫算法示例

    这篇文章主要介绍了基于C语言实现的迷宫算法,结合具体实例形式分析了C语言解决迷宫问题算法的实现技巧与相关注意事项,需要的朋友可以参考下
    2017-09-09

最新评论