在 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.pswp.cn/pingmian/87889.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87889.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/87889.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

408第三季part2 - 计算机网络 - 信道利用率

理解t1是发送帧的传输时间t2是确认帧的传输时间中间是传播过程这整个过程就是发送周期任何题目会有以下几种情况题目这里数据帧和确认帧长度是一样的t1 t2然后把t1的传输数据算出来然后传播是0.2sd停止等待 k1确认帧忽略t2 0t1算好后&#xff0c;求数据帧的长度下面是速率&…

Android framework 开发者模式下,如何修改动画过度模式

Android framework 开发者模式下&#xff0c; 如何修改动画过度模式 开发者模式下&#xff0c;动画过度 模式1.0→0.5&#xff0c;按如下方式修改。 开发云 - 一站式云服务平台 .../core/java/com/android/server/wm/WindowManagerService.java | 8 ---- 1 file changed, …

win11安装paddlelabel并创建目标检测项目

创建虚拟环境 conda create -n paddlelabel python3.11.11 conda activate paddlelabel通过以下命令安装 pip install --upgrade paddlelabel输入命令pdlabel运行paddlelabel&#xff0c;发现报错&#xff1a; ModuleNotFoundError: Please install connexion using the flask …

关于Novatek B/G-R/G白平衡色温坐标系再探究

目录 一、准备知识 二、色温坐标系的构建 三、Novatek白平衡色温坐标系的再探究 2.1 直线白点框 2.2双曲线白点框 四、仿真代码 之前写的一篇博文关于联咏(Novatek )白平衡色温坐标系探究-CSDN博客感觉逻辑上有些混乱,这个周末我又好好思考了下,以…

基于路径质量的AI负载均衡异常路径检测与恢复策略

AI流量往往具有突发性、大象流&#xff08;大规模数据流&#xff09;占比高的特点&#xff0c;极易造成网络拥塞热点。一条质量不佳&#xff08;如高延迟、高丢包、带宽受限&#xff09;的路径&#xff0c;不仅自身无法有效传输数据&#xff0c;如果ECMP继续向其分发流量&#…

ubuntu22.04 安装cuda cudnn

1.输入nvidia-smi查看可以支持安装的cuda最大版本 2.cuda与cudnn版本的选择 核心原则 向下兼容性&#xff1a;较新的 cuDNN 通常兼容旧版 CUDA&#xff0c;但反之不成立 框架依赖&#xff1a;优先考虑深度学习框架&#xff08;TensorFlow/PyTorch&#xff09;的版本要求 硬件…

5、Receiving Messages:Message Listener Containers

提供了两个MessageListenerContainer实现&#xff1a; KafkaMessageListenerContainer ConcurrentMessageListener容器 KafkaMessageListenerContainer在单个线程上接收来自所有主题或分区的所有消息。ConcurrentMessageListenerContainer委托给一个或多个KafkaMessageListe…

JDBC 注册驱动的常用方法详解

JDBC 注册驱动的常用方法详解 在 JDBC 中&#xff0c;注册驱动是建立数据库连接的第一步。以下是几种常用的驱动注册方式&#xff1a; 1. 显式类加载&#xff08;传统方式&#xff09; // 通过 Class.forName() 加载驱动类 Class.forName("com.mysql.cj.jdbc.Driver&qu…

插入数据优化

目录 一.插入数据优化 1.insert语句优化 ①批量插入 ②手动提交事务 ③主键顺序插入 2.大批量插入数据&#xff08;100万条&#xff09; 举例 第一步&#xff1a;连接数据库时&#xff0c;加上--local-infile属性 第二步&#xff1a;查看全局参数local_infile的值&…

区块链在域名系统安全中的应用进展综述

一、区块链与DNS结合的核心原理1.1 传统DNS的安全缺陷中心化架构&#xff1a;传统DNS依赖中心化服务器&#xff08;如ICANN管理的根服务器&#xff09;&#xff0c;存在单点故障风险&#xff0c;易受DDoS攻击或配置错误影响。协议脆弱性&#xff1a;DNS协议设计之初缺乏加密和认…

GO Web 框架 Gin 完全解析与实践

目录 1. 为什么选择 Gin?解锁 Go Web 开发的超能力 Gin 的核心优势 什么时候用 Gin? 第一个 Hello World 2. 路由的艺术:从简单 GET 到复杂匹配 基础路由 高级路由技巧 性能优化小贴士 3. 中间件的魔法:让请求处理更聪明 内置中间件 自定义中间件 中间件的最佳实…

RabbitMQ使用topic Exchange实现微服务分组订阅

案例场景&#xff1a;用户下单后需要多个微服务&#xff08;如营销、会员&#xff09;分别订阅并处理订单事件&#xff0c;且每个微服务可能有多个集群实例&#xff0c;需要保证同一个微服务的集群中&#xff0c;只有一个实例消费到消息。不同于Kafka和rocketMQ有分组消费的功能…

kotlin 通道trysend方法

trySend 方法是 Kotlin 协程中 Channel 类的一个重要功能。它用于向通道发送元素&#xff0c;但与 send 方法不同的是&#xff0c;trySend 是非阻塞的。这意味着它不会在通道满时挂起当前协程&#xff0c;而是会立即返回。 trySend 方法的效果 非阻塞行为&#xff1a; 当你调用…

winform CheckedListBox单击选中解决方案

在WinForms的CheckedListBox控件中&#xff0c;默认需要双击才能切换选中状态&#xff08;复选框勾选&#xff09;。要实现单击即选中&#xff0c;需要通过代码处理鼠标点击事件并手动切换选中状态。以下是实现步骤&#xff1a; 1.CheckOnClick属性置为true即可。 2.通过事件处…

Docker文件操作、数据卷、挂载

一&#xff1a;容器文件操作 在Docker环境中&#xff0c;管理容器内部的文件是一个常见的需求。 无论是为了配置应用、备份数据还是调试问题&#xff0c;了解如何高效地进行文件操作都是非常重要的。 docker cp命令提供了一种简单的方法来在宿主主机和容器之间复制文件或目录…

接口漏洞怎么抓?Fiddler 中文版 + Postman + Wireshark 实战指南

接口安全是现代应用开发中的高危环节&#xff1a;一旦API存在未授权访问、参数篡改、权限绕过等漏洞&#xff0c;可能直接导致用户信息泄露、资金损失甚至整个平台瘫痪。对于开发和安全人员来说&#xff0c;光依赖后端日志排查远远不够&#xff0c;需要对接口进行主动安全性验证…

iOS 出海 App 安全加固指南:无源码环境下的 IPA 加固与防破解方法

随着越来越多国内开发团队将iOS App推向海外市场&#xff0c;如何在交付和分发环节保护应用安全成为出海过程中的重要议题。尤其是App进入多个海外应用商店或通过第三方渠道发行时&#xff0c;容易被当地黑产或竞争对手进行逆向分析&#xff0c;从而暴露内部API、核心业务流程等…

React Hooks 内部实现原理与函数组件更新机制

React Hooks 内部实现原理与函数组件更新机制 Hooks 的内部实现原理 React Hooks 的实现依赖于以下几个关键机制&#xff1a; 1. 链表结构存储 Hook 状态 React 使用单向链表来管理 Hooks 的状态。每个 Hook 节点包含&#xff1a; type Hook {memoizedState: any, // 存储…

分布式会话的演进和最佳实践,含springBoot 实现(Java版本)

一、分布式会话的背景 在微服务架构或集群部署环境下&#xff0c;请求可能落在不同的服务器节点&#xff0c;无法再依赖本地内存来维护用户 Session。因此&#xff0c;需要一种跨节点共享 Session 的机制&#xff0c;这就是 分布式会话管理的核心目标。二、分布式会话的演进历程…

ch03 部分题目思路

G. 收集 由于稀有度相同的物品需要一起处理&#xff0c;我们先把他们聚集到一起。 类似这样&#xff1a; vector<int> g[maxn]; ... {cin >> x >> c;g[c].push_back(x); }那么我们需要一个贪心的思路&#xff1a; 肯定是按 ccc 从小往大收集的&#xff1b;对…