QT之智能指针

这篇具有很好参考价值的文章主要介绍了QT之智能指针。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        如果没有智能指针,程序员必须保证new对象能在正确的时机delete,四处编写异常捕获代码以释放资源,而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。

        来看看一个野指针例子

        程序将会异常结束,因为delete view 后 label也被delete了

QT之智能指针,QT,C++,qt,开发语言,智能指针,C++ 

        QPointer作为一个模板类,它有很类似与普通的指针,它会动态监视分配空间的对象是否被delete 了。它保存了一个QObject 的指针,并把这个指针的指针交给全局变量处理,在对象销毁时会调用 QObjectPrivate::clearGuards() 函数把双指针置为零,所以可以使用 QPointer::isNull() 判断是否已经被销毁。它不是线程安全的。该类在QT4被废弃了,但QT5又重写了

QT之智能指针,QT,C++,qt,开发语言,智能指针,C++ 

        看看局部变量,当show函数结束时并没有堆widget删除,导致内存溢出

QT之智能指针,QT,C++,qt,开发语言,智能指针,C++

        QSharedPointer  行为最接近原始指针,是最像指针的"智能指针", 与 QScopedPointer 一样包装了new操作符在堆上分配的动态对象,但它实现的是引用计数型的智能指针 ,可以被自由地拷贝和赋值,在任意的地方共享它,当没有代码使用(引用计数为0)它时才删除被包装的动态分配的对象。实现了引用计数的可共享资源的强类型指针,它是线程安全的。它不能转让所有权。运行后,widget界面将会一闪而过,因为它已经在show()作用域结束时被销毁了

QT之智能指针,QT,C++,qt,开发语言,智能指针,C++

        QWeakPointer它实现了引用计数的可共享资源的弱类,它是线程安全的。在它所指向的资源的所有权期间,允许外界释放其资源从而使其放弃所有权,它更像是 QSharedPointer 的助手。在QT4它比QPointer更加高效,但是在QT5它被废弃啦,你不应该继续使用它

QT之智能指针,QT,C++,qt,开发语言,智能指针,C++

        QScopedPointer实现了非引用计数的独享资源的强类型指针,它是线程安全的。它的所有权不能转让,因为它的拷贝和赋值都是私有的

QT之智能指针,QT,C++,qt,开发语言,智能指针,C++ 

        QScopedArrayPointer派生自 QScopedPointer 它存储的是指向动态分配的对象指针,默认使用的是 delete [] 释放

QT之智能指针,QT,C++,qt,开发语言,智能指针,C++ 

        QSharedDataPointer可以指向一个隐式共享类对象。QSharedDataPointer<T>你可以很容易的实现自己的隐式共享类,QSharedDataPointer实现了线程安全的引用计数,从而保证了你自己写的可重入的隐式共享类不会因为加入QSharedDataPointer而变得不可重入。隐式共享应用在很多Qt类中,实现了速率和内存效率的有效结合

        EmployeeData 必需继承自QSharedData,QSharedData类是共享数据的基类,它提供引用计数,它只有默认的构造函数,拷贝构造函数和析构函数,一般情况下,我们有必要自己重写这几个函数。Employee数据成员只有一个QSharedDataPointer<EmployeeData>指针,所以对d访问必须通过->方法。当我们需要改变d的数据时,如果d的引用计数大于1的话,将会调用detach()对d进行拷贝生成新的对象。从而保证了所以对d的改变,不会影响到别的引用。Employee对象被拷贝、用于赋值或者当成参数传递时,QSharedDataPointer指针的引用技术自动增加1;Employee对象被销毁或者超出作用域时,QSharedDataPointer指针的引用计数将自动减小1.当QSharedDataPointer引用计数为0时将自动销毁。

它是深拷贝的

QT之智能指针,QT,C++,qt,开发语言,智能指针,C++ 

自动垃圾回收

        t 对象清理器是实现自动垃圾回收的很重要的一部分。QObjectCleanupHandler可以注册很多子对象,并在自己删除的时候自动删除所有子对象。同时,它也可以识别出是否有子对象被删 除,从而将其从它的子对象列表中删除。这个类可以用于不在同一层次中的类的清理操作,例如,当按钮按下时需要关闭很多窗口,由于窗口的 parent 属性不可能设置为别的窗口的 button,此时使用这个类就会相当方便。

QT之智能指针,QT,C++,qt,开发语言,智能指针,C++

 文章来源地址https://www.toymoban.com/news/detail-578975.html

到了这里,关于QT之智能指针的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT学习开发笔记(项目实战之智能家居物联网项目1 )

    本章介绍使用 Qt 开发智能家居中的一个物联应用。简单直白的说就是通过云服务器远程控 制设备(与设备通信等)。本章可以直接做毕设,是毕设物联网项目的一大福音!本章将实现远 程点亮开发板 LED 作为一个项目实例。 在生活中,我们可能使用过 WIFI 智能插座这款产品

    2023年04月13日
    浏览(66)
  • 【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 战斗背景:做了个串口接收界面,用来接收传输过来的信号。但是光用数字显示太单调,需要用图线显示出来。 战略目标:干掉它。 战术路线:Qt 绘图可以使用 Qt Charts,先了解

    2024年02月11日
    浏览(52)
  • 【VisualStudio】使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月10日
    浏览(77)
  • QT使用MQTT协议连接ONENET云平台:智能家居PC客户端开发笔记-2 项目开发

    这篇文章主要是分享QT智能家居项目的代码 在我看来,QT MQTT的使用主要难点就是对于环境的搭建,在我们把环境搭建完之后,接下来就是传统手艺了,我们只要知道相应的库函数,调用它,就能实现我们所需要的功能了。 所以,在这里我也只是简单的分享一下我写的第一版

    2024年02月16日
    浏览(52)
  • 【VisualStudio】基于 Visual Studio 使用 C++ 语言开发 Qt 环境配置教程

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 先上一张效果图,具体步骤主要分为以下三步。 这一步不再赘述,注意一定要安装 C++ 语言。 可以参考这个教程 Visual Studio 2022安装与使用教程。 这一步也不再赘述,网上搜索教

    2024年02月15日
    浏览(70)
  • 【Visual Studio】使用 C++ 语言,配合 Qt,开发了一个串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 我要使用的功能比较简单,主要包含扫描串口、打开串口、发送数据、接收数据、暂停按钮、停止按钮,因此接下里将围绕这几个功能依次更新。 我的工程项目名字叫 “GUI”。

    2024年02月11日
    浏览(71)
  • Qt 隐藏鼠标指针

    Qt 可以设置在软件窗口下的鼠标样式或者隐藏鼠标指针,通过setCursor可以实现,该接口可以在以下几个类中设置 这里以 QWidget 下来举例说明。 1.如果只希望在某个 widget 中不显示鼠标指针,那么在该 widget 的构造函数中调用 2.如果希望整个应用程序不显示鼠标指针,那么在实

    2024年02月11日
    浏览(50)
  • 【Visual Studio】报错 C2653,使用 C++ 语言,配合 Qt 开发串口通信界面

    知识不是单独的,一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏:Visual Studio。 这个 Bug 是我做这个工程时遇到的:【Visual Studio】Qt 的实时绘图曲线功能,使用 C++ 语言,配合 Qt 开发串口通信界面。 使用 C++ 语言,配合 Qt 开发串口通信界面,在添加 Widget 做

    2024年02月11日
    浏览(55)
  • QT使用MQTT协议连接ONENET云平台:智能家居PC客户端开发笔记-1 环境搭建

    前端时间做了一个项目,要求在PC端使用QT制作一个客户端,用来接收从单片机上传到Onennet的数据,并且还要下发指令。当时弄了好几天,中途遇见了非常多的问题,所以写下这篇文章记录一下,同时分享一下自己的经验。 我的环境:QT 5.12.6 总结下我遇见的难点: 1,环境配

    2024年02月11日
    浏览(69)
  • QT6之类实例化——对象指针和对象

    Qt完全遵循C++ 中类的实例化动作按存储位置可以分为 栈中分配内存 和 堆中分配内存 两种,分别对应不用 new 实例化类和用 new 实例化类。 一、实例化两种方式 1、栈中分配; 如下图是qt非常常见的操作,将m_view声明为对象,它完全表明该对象的生命周期与MyWidget的生命周期相

    2023年04月25日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包