QT-智能指针

2023-11-05

/* <
 * 智能指针与普通指针 最明显区别普通指针
 * 要手动去释放,智能指针出了作用域自动释放
 * 完全不用担心有内存忘记释放的操作
*  >
*   智能指针
*   1-QScopedPointer 区域指针
*   2-QSharedPointer 智能指针(强引用计数指针)可以拷贝多个赋值只是增加 引用计数(当引用计数归0释放数据内存空间)
*   3-QWeakPointer   弱引用计数指针
*   4-QEnableSharedFromThis
*   5-指针博大精深奈何鄙人一叶障目,怎见泰山,它日重游在做理解。
*/
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QDebug>
#include <QScopedPointer>   //智能指针
#include <QSharedPointer>
struct X{
  X(){
        qDebug()<<"()fun_x";
  }
  ~X(){
        qDebug()<<"~()fun_x";
  }
  void fun_x(){
      qDebug()<<"fun_x";
  }
};
template<class T> //重写清理函数
struct Cleanup{
  static void cleanup(T* x)
  {
      qDebug()<<__PRETTY_FUNCTION__;   //打印 方法信息
      delete x;
  }
};
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;

    ///测试智能指针 QScopedPointer
    {//作用域
        QScopedPointer<X,Cleanup<X>> qsp_x(new X()); //打印()fun_x
        if(qsp_x)
        {
            qsp_x->fun_x();               //打印fun_x
        }
        else {

        }
    }                                     //打印~()fun_x  出作用域释放
    ///测试智能指针 QScopedPointer
    {//作用域
        QScopedArrayPointer<X> qsp_X(new X[2]);  //new 一个数组 在Cleanup里面是delete []p
        qsp_X->fun_x();                          //<       禁止拷贝操作(浅拷贝)
        qsp_X[0].fun_x();//真香啊数组下标访问       //假如多个拷贝操作,同一块内存空间将会被多个指针
        qsp_X[1].fun_x();                        //指向那么在释放一个指针的时候delete就会将唯一
    }                                            //一块隐式共享区域释放,其他指针将不受控制   >
    qDebug()<<endl;
    ///测试智能指针 QSharedPointer 为共享内存而生
    {
        QSharedPointer<X> qhp_x(new X());  //内置:引用计数 多个此指针可以指向一块内存空间释放时不冲突
        QSharedPointer<X> qhp_x1(qhp_x);   //可以拷贝操作,每一次的拷贝都会让引用计数+1,指针的释放
        QSharedPointer<X> qhp_x2=qhp_x;    //引用计数只是-1,当引用计数为0的时候 彻底释放数据内存空间
                                           //此时:引用计数 为3
        /*qhp_x->fun_x(); //调用结构体的方法->
        X& ref_x=*qhp_x;  //引用赋值
        ref_x.fun_x();*/  //调用结构体的方法 .

        X* test_X=new X();
        X* test_y=new X();
        QSharedPointer<X> qhp_x_a(test_X); //test_X与qhp_x_a指向同一块内存空间
        qhp_x_a.reset(test_y); //有参数:清空它所指向的对象,并且指向新的内存空间
        //qhp_x_a.reset();     //无参数:清空它所指向的对象,并为空

        //当指针指向 基类或派生类 可以通过 动态  转换--(类似于普通指针)
        //qhp_x_a.constCast<>();  //const 转换成 非const
        //qhp_x_a.staticCast<>(); //静态转换
        //qhp_x_a.dynamicCast<>();//动态转换
    }
    /// 弱引用计数 指针 < 用于相互引用,class A有指针要指向B-class B有指针要指向A
    ///                强引用计数 指针会导致不能正常释放内存空间,因为引用计数始终不为0
    ///                用弱引用计数指针不会增加 引用计数 > 有待加深
    QWeakPointer<X> qwp_x;
    //qwp_x-> 弱引用计数 指针无法正常访问函数
    QSharedPointer<X> qqshar_x=qwp_x; //引用计数+1
    qqshar_x->fun_x();
    ///测试智能指针
    ///QEnableSharedFromThis 返回this指针及解决办法,让引用计数归一    有待加深

    return app.exec();
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT-智能指针 的相关文章

随机推荐

  • securecrt从服务器获取文件夹,在SecureCRT屏幕下获取数据并存至文件中

    在SecureCRT屏幕上获取数据并存至文件中 在CRT屏幕上获取某个具体位置的文本 可以使用Screen 对象的Get or Get2 方法去获取屏幕上的数据 1 Get 函数包含四个参数 文本第一个字符所在的行号 列号 最后个字符所在的
  • C语言学习路线图 #CSDN博文精选# #IT技术# #C语言# #学习路线# #系统化学习#

    大家好 我是小C 又见面啦 文章过滤器 精选大咖干货 助力学习之路 5天20篇CSDN精选博文带你掌握系统化学习方法 专栏将挑选有关 系统化学习方法 的20篇优质文章 帮助大家掌握更加科学的学习方法 在这里 你将收获 快速掌握系统化学习的理
  • Docker-compose安装

    docker compose docker compose是用于定义和运行多容器docker应用程序的工具 compose 通过一个配置文件来管理多个docker容器 可以使用docker compose yml脚本来启动 停止 重启应用
  • 如何编写测试用例

    用例的五个构成元素 下面从这五个元素的角度 去剖析如何编写测试用例 用例标题 用例标题就是测试点名称 用例标题是用来说明这个用例的测试目的的 好的用例标题是别人看完你这个用例标题后就知道你这个用例是测什么的 但并不是标题越详细越好 既然是标
  • Cdiak

    include
  • 多模态超省钱!JinaChat 面向开发者的大模型服务

    2023年6月25日 Jina AI 发布了 JinaChat 一个面向开发者和终端用户的多模态大模型API 传统大型语言模型往往将竞争力建立在 参数多 和 刷分强 的基础上 然而对于应用开发者来说 传统模型商的 API 并不能很好地让开发
  • STM32F4驱动42步进电机(采用驱动器)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 器件 实物 接线 TB6600拨码卡关 代码说明 main c 代码如下 示例 main c 代码 极简版 step motor c 代码如下 示例 step mo
  • 机票票面各项内容详解

    ALLOW 或 BAG 说明免费托运行李的限制 记重或记件 例如印 20K 就表示限带 20公斤 超重部分运费还要另计 一般经济舱每人限重为 20 公斤 相关内容见 行李规定 BOOKING REF 订票代号 CARRIER 表示 航空公司
  • Nginx启动,重启以及基本命令

    1 启动nginx 进入nginx安装目录执行 sbin nginx c conf nginx conf 2 验证nginx配置文件是否正确 方法1 进入nginx安装目录sbin下 输入命令 nginx t 回显test is succe
  • ubuntu工具列表

    微信 GitHub zq1997 deepin wine deepin源移植 Debian Ubuntu上最快的QQ 微信安装方式 FileZilla ftp sftp连接服务器 Ubuntu18 04安装FileZilla ubuntu安
  • 程序设计之归并排序

    6 86 归并排序 10 分 本题要求实现二路归并排序中的归并操作 待排序列的长度1 lt n lt 1000 函数接口定义 void Merge SqList L int low int m int high 其中L是待排序表 使排序后的
  • 阿里前端开发工具Weex安装学习

    支持原创 更多内容欢迎关注作者博客 http www china10s com blog p 314 移动互联网的开发方式 最开始的手机厂商定制版的封闭系统开发 到后来智能机出现之后 Android和iOS异军突起 形成了两大独立的阵营 这
  • Table is marked as crashed and should be repaired 解决办法

    遇到这个问题几个敲命令轻松搞定 1 首先进入mysql命令台 mysql u root p 回车 输入密码 2 查询所有的库 mysql gt show databases 3 进入数据库 eduyun 2015 sp1 是库名 mysql
  • JAVA设计模式(15)-解释器模式

    定义 给定一种语言 定义他的文法的一种表示 并定义一个解释器 该解释器使用该表示来解释语言中句子 类型 行为类模式 类图 解释器模式是一个比较少用的模式 本人之前也没有用过这个模式 下面我们就来一起看一下解释器模式 解释器模式的结构 抽象解
  • mac 如何安装hp laserjet m1136驱动

    直接在苹果的官网下载驱动就可以了 要下V5 1的那个版本https support apple com kb DL1888 viewlocale zh CN locale zh CN 选择系统偏好设置中的打印机 然后选择相对应的版本就可以了
  • C++语言基础

    1 1 1 简述下C 语言的特点 参考回答 C 在C语言基础上引入了面对对象的机制 同时也兼容C语言 C 有三大特性 1 封装 2 继承 3 多态 C 语言编写出的程序结构清晰 易于扩充 程序可读性好 C 生成的代码质量高 运行效率高 仅比
  • win10连接文件服务器记住密码如何删除,win10系统删除已记住的访问共享的账户与密码的操作方法...

    win10系统删除已记住的访问共享的账户与密码的操作方法 很多win10用户在使用电脑的时候 会发现win10系统删除已记住的访问共享的账户与密码的的现象 根据小编的调查并不是所有的朋友都知道win10系统删除已记住的访问共享的账户与密码的
  • Inno Setup 系列之先卸载之后再安装

    Inno Setup 系列之先卸载之后再安装 需求使用Inno Setup打包程序之后 很多时候我们需要在安装文件之前卸载原有的程序而不是覆盖安装 本文的Code就是实现了这样的功能 如果想要在安装前先卸载 那么需要加下面代码 需要注意的是
  • 案例分析2

    文章目录 16 质量属性 数据库 嵌入式 web 软件设计 15 质量属性 飞机起飞 嵌入式 数据库 数据持久层 14 mvc 数据流图 构件 质量属性 web 13 ESB mvc 安全 12 架构风格 ODP 嵌入式 设计模式 关系型数
  • QT-智能指针

    lt 智能指针与普通指针 最明显区别普通指针 要手动去释放 智能指针出了作用域自动释放 完全不用担心有内存忘记释放的操作 gt 智能指针 1 QScopedPointer 区域指针 2 QSharedPointer 智能指针 强引用计数指针