首页 > 编程语言 >c++ 标准 智能指针 与 qt 智能指针 对比

c++ 标准 智能指针 与 qt 智能指针 对比

时间:2024-11-14 12:49:46浏览次数:3  
标签:std Qt QObject 智能 shared 指针 ptr qt

C++ 标准库提供了 std::unique_ptrstd::shared_ptr 等智能指针,而 Qt 则提供了 QScopedPointerQSharedPointerQWeakPointer 等自己的智能指针。两者在设计上有一些相似之处,但也存在一些关键的差异。下面是 C++ 标准智能指针和 Qt 智能指针的详细对比:


1. std::unique_ptr 和 QScopedPointer

相似性
  • 独占所有权std::unique_ptrQScopedPointer 都表示独占所有权的智能指针,即它们的指向对象只能由一个智能指针管理。
  • 自动内存管理:两者在超出作用域时都会自动销毁所指向的对象,不需要手动 delete,因此可以防止内存泄漏。
不同点
  • 移动语义

    • std::unique_ptr 支持 C++11 的移动语义,允许通过 std::move 将所有权从一个 unique_ptr 转移到另一个 unique_ptr
    • QScopedPointer 不支持移动语义。它的设计意图是将其用于局部作用域的资源管理,不支持所有权转移。因此,一旦 QScopedPointer 创建后,它的所有权不能再转移。
  • 作用域的严格性

    • QScopedPointer 的设计目的是“作用域清理”,它的生命周期严格绑定在作用域内,因此适合在局部作用域内使用。
    • std::unique_ptr 适用于更灵活的内存管理场景,可以在函数间传递、作为返回值、存储在容器中等。
  • Qt 特有功能

    • QScopedPointer 提供了 QScopedPointerDeleteLater 功能,用于在 Qt 的事件循环中延迟删除对象(通过调用 QObjectdeleteLater())。
总结
  • std::unique_ptr 更加通用,适合管理独占的动态内存,允许转移所有权。
  • QScopedPointer 更严格,用于局部作用域内的资源管理,不支持所有权转移。

2. std::shared_ptr 和 QSharedPointer

相似性
  • 共享所有权std::shared_ptrQSharedPointer 都表示共享所有权的智能指针,多个智能指针可以指向同一个对象。
  • 引用计数:两者都通过引用计数来管理对象的生命周期。当引用计数为 0 时,智能指针会自动释放对象。
不同点
  • 弱引用支持

    • std::shared_ptr 通常与 std::weak_ptr 配合使用。std::weak_ptr 不会增加引用计数,主要用于解决循环引用问题。
    • QSharedPointer 也可以与 QWeakPointer 配合使用,类似于 std::weak_ptr,但是 QWeakPointer 还可以绑定到非 QSharedPointer 管理的对象上(通过 QWeakPointer::data())。
  • 线程安全

    • C++ 标准库的 std::shared_ptr 默认是线程安全的,即引用计数操作是原子性的。
    • Qt 的 QSharedPointer 直到 Qt 5.10 才增加了线程安全的支持。使用前需要确保 Qt 版本支持所需的线程安全特性。
  • 自定义删除器

    • std::shared_ptr 支持自定义删除器,允许开发者指定对象销毁的方式。
    • QSharedPointer 也支持自定义删除器,但实现方式稍有不同。Qt 使用 QSharedPointer::create 函数来初始化智能指针,允许传入自定义的删除函数。
  • 集成 Qt 对象系统

    • QSharedPointer 可以和 Qt 的对象系统更好地集成,特别是在 Qt 的 QObject 体系中,更容易和 Qt 的信号与槽、事件系统等结合使用。
总结
  • std::shared_ptr 更灵活,尤其是在多线程和自定义删除方面;在大多数标准 C++ 项目中应用广泛。
  • QSharedPointer 更适合 Qt 项目,尤其是在需要与 QObject 类或 Qt 信号槽机制集成时使用。

3. std::weak_ptr 和 QWeakPointer

相似性
  • 弱引用std::weak_ptrQWeakPointer 都表示弱引用指针。弱引用不会增加对象的引用计数,主要用于防止循环引用。
  • 访问方式:两者都提供类似的 lock() 方法来获取指向原对象的强引用,如果原对象已经销毁,lock() 会返回空指针。
不同点
  • 与不同智能指针的兼容性

    • std::weak_ptr 只能与 std::shared_ptr 配合使用。
    • QWeakPointer 可以与 QSharedPointer 一起使用,也可以与普通的 QObject 指针结合使用,便于管理 QObject 生命周期。
  • 生命周期检查

    • QWeakPointer 支持自动检查对象的生命周期,因此它可以用于检测对象是否已经被销毁,特别是在 QObject 管理中非常有用。
    • std::weak_ptr 主要用作 std::shared_ptr 的辅助工具,不具备直接与原生指针的兼容性。
总结
  • std::weak_ptr 更适用于纯 C++ 环境中的弱引用管理。
  • QWeakPointer 更适合 Qt 环境,特别是在需要跟踪 QObject 的生命周期时更为方便。

4. QPointer(Qt 专有)

QPointer 是一个特殊的智能指针,仅适用于 Qt 的 QObject 派生类。它在被管理的 QObject 被销毁时会自动置为 nullptr,不增加引用计数。

特点
  • 生命周期跟踪QPointer 非常适合用于跟踪 QObject 的生命周期。与 QWeakPointer 类似,但更简单,只能用于 QObject 对象。
  • 避免悬空指针:当 QObject 被销毁时,QPointer 会自动变成 nullptr,避免了悬空指针的问题。
  • 无引用计数QPointer 不会增加 QObject 的引用计数,因此它不具备 shared_ptr 的共享管理功能。
适用场景
  • 适合用于需要在 Qt 应用中跟踪 QObject 对象,但不希望增加其引用计数的场景。例如,在信号与槽机制中,需要跟踪信号发送者的生命周期时,QPointer 非常有用。

总结

功能std::unique_ptrQScopedPointerstd::shared_ptrQSharedPointerstd::weak_ptrQWeakPointerQPointer
独占所有权✔️✔️
共享所有权✔️✔️
支持弱引用✔️(使用 weak_ptr✔️(使用 QWeakPointer✔️✔️
移动语义✔️✔️✔️
线程安全✔️(原子计数)❌(非线程安全)✔️(原子计数)✔️(Qt 5.10+ 支持)✔️✔️
自定义删除器✔️部分支持✔️✔️
QObject 集成✔️✔️✔️

总结建议

  • 标准库智能指针std::unique_ptrstd::shared_ptrstd::weak_ptr):适用于跨平台的纯 C++ 项目,尤其在不依赖 Qt 的项目中。
  • Qt 智能指针QScopedPointerQSharedPointerQWeakPointerQPointer):适合在 Qt 应用中使用,特别是在需要

QObject 生命周期集成的场景中更为方便。

  • QPointer:专门用于 QObject 类的生命周期管理,没有引用计数,是轻量级的弱指针。

根据项目需求,选择合适的智能指针类型可以帮助你更好地管理内存和资源,提高代码的可读性和安全性。

标签:std,Qt,QObject,智能,shared,指针,ptr,qt
From: https://blog.csdn.net/qq_43689451/article/details/143758012

相关文章

  • 人工智能AI→计算机视觉→机器视觉→深度学习→在ImageNet有限小样本数据集中学习深度
    前言:通过前篇《人工智能AI→计算机视觉→机器视觉→深度学习→在ImageNet有限小样本数据集中学习深度模型的识别任务实践》我们可以学到如何对实际生活、工作场景中的字符识别、人脸识别、图像类别进行识别的基于深度学习方法的技术路径实现具体包括:准备数据集制作、创建深......
  • 5倍提升工作效率,智能合同审查开源系统助力律师行业智能化
    一、系统概述在法律行业,律师和法务人员每天需要处理大量的法律文件和复杂的案件信息。然而,手工分析和关联文档信息既耗时,又容易导致遗漏和错误。为此,我们推出了一款专为法律行业打造的开源免费软件,利用关系抽取算法和深度学习技术,支持自动识别底稿文档中的当事人、律师、法院等......
  • 手把手教你用Coze零代码搭建一个智能搜索智能体,高时效性、保姆级!
    随着大模型技术的发展,越来越多的技术开始涌现,从聊天助手,到智能体,再到工作流,最后到三者的整合。大模型技术朝着更加智能化、通用化、个性化的方向发展,为人们的生活和工作带来了更多的便利和创新。今天,手把手教大家如何通过Coze零代码搭建一个智能搜索智能体,能够根据你的关键......
  • 通过人工智能技术,滚球预测或将不再是天方夜谭
    一、引言在竞技体育领域,充斥着不少令体育爱好者位置着迷的项目,而在这其中,滚球可谓是最具备戏剧性的一种,它难以预测,而随着人工智能(AI)技术的飞速发展,利用AI进行滚球预测却逐渐成为了可能。本文将深入探讨AI在滚球预测中的应用,以及其背后的算法原理,务求为大家解密人工智能技术在......
  • 现场直击|启明云端&触觉智能亮相2024德国慕尼黑电子展
    2024德国慕尼黑国际电子元器件博览会于11月12日正式拉开帷幕,启明云端&触觉智能正式亮相2024德国慕尼黑电子展,欢迎大家莅临我司B6-351展位交流、沟通合作。本次展会时间为2024年11月12至11月15日,作为全球电子行业的顶级盛会之一,此次展会聚焦汽车、无线技术、医疗电子、新能源等众......
  • 鸿蒙开发实战:智能日志定位与高效调试技巧
    在鸿蒙系统的开发过程中,日志定位是一个关键的调试步骤。想象一下,如果你能够轻松地在繁杂的代码中快速定位到日志产生的位置,那将会极大地提高你的开发效率。今天,我将分享一套代码,它能帮助你实现这一目标。效果展示当你使用这套代码时,日志的打印效果将如下所示:W1234at(ent......
  • 基于华为云FunctionGraph和ModelArts的智能动漫头像生成:从自拍到AI风格化的编程
    文章目录1引言2背景介绍2.1华为云FunctionGraph与ModelArts简介3项目准备3.1注册与登录华为云账号4实验步骤4.1首先我们配置云主机4.2安装FunctionGraph插件4.3创建函数4.4部署函数4.5函数配置委托4.6函数配置触发器4.7函数添加依赖包4.8订阅模型并部署A......
  • 智能驱动下的客户运营与知识管理整合策略
    在数字化转型的浪潮中,智能技术的应用正深刻改变着企业的运营模式和客户服务方式。智能驱动下的客户运营与知识管理整合策略,旨在通过智能化手段,优化客户体验,提升运营效率,同时实现知识的有效管理和利用。本文将深入探讨这一策略的核心价值、实施路径及实践案例,为企业提供参考。一......
  • 基于大数据 Python 智能水果销售系统(源码+LW+部署讲解+数据库+ppt)
    !!!!!!!!!选题不知道怎么选不清楚自己适合做哪块内容都可以免费来问我避免后期給自己答辩找麻烦增加难度(部分学校只有一次答辩机会没弄好就延迟毕业了)会持续一直更新下去有问必答一键收藏关注不迷路源码获取:https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwd=jf1d提取码:......
  • QT: 操作主从视图及XML
    按钮绑定信号、槽控件属性  运行效果:  connectdlg.h #ifndefCONNECTDLG_H#defineCONNECTDLG_H#include<QDialog>#include<QMessageBox>classQSqlError;namespaceUi{classConnDlg;}classConnDlg:publicQDialog{Q_OBJECTpublic:......