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

Qt智能指针

在 Qt 框架中,智能指针用于自动管理对象的生命周期,防止内存泄漏。以下是 Qt 中主要的智能指针及其用法详解:

1. QScopedPointer

  • 作用:独占所有权,超出作用域时自动释放对象(类似 std::unique_ptr)。

  • 特点

    • 不可复制,但可通过 release() 转移所有权。

    • 适用于局部作用域内的对象管理。

  • 示例

    #include <QScopedPointer>void demo() {QScopedPointer<QObject> ptr(new QObject());ptr->setObjectName("MyObject");// 离开作用域时自动释放内存
    }

2. QSharedPointer

  • 作用:共享所有权,基于引用计数(类似 std::shared_ptr)。

  • 特点

    • 多个指针共享同一对象,最后一个指针销毁时释放对象。

    • 线程安全(引用计数原子操作)。

  • 示例

    #include <QSharedPointer>void demo() {QSharedPointer<QObject> ptr1(new QObject());QSharedPointer<QObject> ptr2 = ptr1; // 共享所有权// 当 ptr1 和 ptr2 都销毁时,对象被释放
    }

3. QWeakPointer

  • 作用:弱引用,解决 QSharedPointer 的循环引用问题(类似 std::weak_ptr)。

  • 特点

    • 不增加引用计数,不阻止对象销毁。

    • 需通过 toStrongRef() 转为 QSharedPointer 后使用。

  • 示例

    #include <QSharedPointer>
    #include <QWeakPointer>void demo() {QSharedPointer<QObject> shared(new QObject());QWeakPointer<QObject> weak = shared;if (!weak.isNull()) {QSharedPointer<QObject> locked = weak.toStrongRef();if (locked) {// 安全使用对象}}
    }

4. QPointer

  • 作用:专为 QObject 设计的弱指针。

  • 特点

    • 不管理生命周期,仅监控对象是否被销毁。

    • 对象销毁后自动置为 nullptr

  • 示例

    #include <QPointer>void demo() {QObject* obj = new QObject();QPointer<QObject> p(obj);delete obj; // 手动删除对象if (p.isNull()) {qDebug() << "Object has been deleted!";}
    }

5. QSharedDataPointer

  • 作用:实现隐式共享(Copy-on-Write),用于自定义数据类型。

  • 特点

    • 当数据被修改时自动创建副本(类似 QString 的行为)。

    • 需配合 QSharedData 派生类使用。

  • 示例

    #include <QSharedData>
    #include <QSharedDataPointer>class MyData : public QSharedData {
    public:int value = 0;
    };class MyClass {
    public:QSharedDataPointer<MyData> data;
    };void demo() {MyClass a;a.data->value = 10;MyClass b = a; // 共享数据b.data->value = 20; // 修改时自动复制(COW)
    }

关键对比表

智能指针所有权适用场景是否管理生命周期
QScopedPointer独占局部作用域对象
QSharedPointer共享跨作用域共享对象
QWeakPointer无(弱引用)打破循环引用❌(仅观察)
QPointer无(弱引用)监控 QObject 对象存活状态❌(仅观察)
QSharedDataPointer共享(COW)实现隐式共享的数据类

最佳实践建议

  1. 优先使用 QScopedPointer
    对于局部对象,它更轻量且安全。

  2. 避免循环引用
    使用 QWeakPointer 打断 QSharedPointer 的循环引用。

  3. QObject 的特殊性

    • 若对象有父对象(parent),通常无需智能指针(父对象删除时自动析构子对象)。

    • 监控 QObject 存活用 QPointer,而非手动检查 nullptr

  4. 与 STL 智能指针互操作
    Qt 智能指针可与 std::shared_ptr 等交互,但需注意:

    // 将 QSharedPointer 转为 std::shared_ptr
    QSharedPointer<QObject> qtPtr(new QObject());
    std::shared_ptr<QObject> stdPtr = qtPtr; // 隐式转换

通过合理使用这些智能指针,可以显著提升 Qt 程序的内存安全性和代码健壮性。

http://www.dtcms.com/a/267608.html

相关文章:

  • 408第三季part2 - 计算机网络 - 计算机网络分层结构
  • Python数据分析基础04:预测性数据分析
  • 非负矩阵分解(NMF)的python应用 ,基因分析,以胰腺癌上皮亚簇为实例,NMF在癌症研究中的优势
  • 支持多方式拼接图片的软件
  • Zama 机密区块链协议Litepaper
  • RAL-2025 | 清华大学数字孪生驱动的机器人视觉导航!VR-Robo:面向视觉机器人导航与运动的现实-模拟-现实框架
  • 【ES6】Latex总结笔记生成器(网页版)
  • RocketMQ一键启动_window
  • 黑马点评系列问题之基础篇06初识redis测试连接redis失败
  • 硬件嵌入式工程师学习路线终极总结(二):Makefile用法及变量——你的项目“自动化指挥官”!
  • 深度学习5(深层神经网络 + 参数和超参数)
  • Ubuntu 20.04 编译安装FFmpeg及错误分析与解决方案
  • 数据结构:数组:插入操作(Insert)与删除操作(Delete)
  • PageRank:互联网的马尔可夫链平衡态
  • 利用已有的 PostgreSQL 和 ZooKeeper 服务,启动dolphinscheduler-standalone-server3.1.9 镜像
  • Redis基础(6):SpringDataRedis
  • Java创建型模式---工厂模式
  • java多线程--死锁
  • CppCon 2018 学习:Standard Library Compatibility Guidelines (SD-8)
  • 未成功,做个记录,SelfHost.HttpSelfHostServer 如何加载证书
  • 【Prometheus】Grafana、Alertmanager集成
  • 小架构step系列05:Springboot三种运行模式
  • 理想汽车6月交付36279辆 第二季度共交付111074辆
  • 基于微信小程序的校园跑腿系统
  • MySQL——9、事务管理
  • Java-继承
  • 远程协助软件:Git的用法
  • STM32第15天串口中断接收
  • 数据结构:数组抽象数据类型(Array ADT)
  • oracle的内存架构学习