QPointer的使用以及场景
QPointer的使用以及场景
在我们项目开发中,经常会遇到这种情况,在A中引用了B的对象,但是你却不知道B什么时候会析构,所以使用它会出现异常;所以今天的主角要登场了QPointer可以完美的解决这样的问题。
先来看一下介绍
The QPointer class is a template class that provides guarded pointers to QObject. A guarded pointer, behaves like a normal C++ pointer T *, except that it is automatically cleared when the referenced object is destroyed (unlike normal C++ pointers, which become “dangling pointers” in such cases).
T must be a subclass of QObject.
官方已经很清楚了,提炼一下,QPointer是一个模版类,指向的对象必须是QObject的派生类,声明的方式是OPointer<T> p1;
下面看一下具体的代码
QWidget* p1 = new QWidget();
QWidget* p2 = p1;
delete p1;
p1 = Q_NULLPTR;
qDebug()<<"delete p1";
if(p2)
{
qDebug()<<"p2 is not NULL,p2 call show Widget";
p2->show();
qDebug()<<"Widget show";
}
else
{
qDebug()<<"p2 is NULL";
}
————————————————
运行结果
delete pw
pw2 is not NULL,pw2 call show Widget
程序异常结束。
这个结果说明当p1指向的对象被析构时,p2指向的对象自然时析构了(他们指向的同一个对象),但是p2的指针不是一个空指针,所一程序qDebug()<<“Widget show”;没有执行程序就Crash了。
让我们把它改写成QPointer
QWidget* p1 = new QWidget();
QPointer<QWidget> p2 = p1;
delete p1;
p1 = Q_NULLPTR;
qDebug()<<"delete p1";
if(p2)
{
qDebug()<<"p2 is not NULL,p2 call show Widget";
p2->show();
qDebug()<<"Widget show";
}
else
{
qDebug()<<"p2 is NULL";
}
————————————————
运行结果
delete p1
p2 is NULL
这个结果说明当p1指向的对象被析构时,p2的指针被置为空了,所以输出了“p2 is NULL";
从这两段代码来看我们可以直观的了解到QPointer的用法以及使用场景,但是一定要注意的是指向的对象必须是继承于QObject,至于为什么大家可以看看源码,或者我有时间在写一下它的实现原理。
QPointer的使用以及场景的更多相关文章
- 拨开迷雾,找回自我:DDD 应对具体业务场景,Domain Model 到底如何设计?
写在前面 除了博文内容之外,和 netfocus 兄的讨论,也可以让你学到很多(至少我是这样),不要错过哦. 阅读目录: 迷雾森林 找回自我 开源地址 后记 毫无疑问,领域驱动设计的核心是领域模型,领 ...
- [NodeJS] 优缺点及适用场景讨论
概述: NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 本文就个人使用经验对这些问题进行探讨. 一. ...
- Asp.Net MVC中使用StreamReader读取“Post body”之应用场景。
场景:有三个市场(Global.China.USA),对前台传过来的数据有些验证需要细化到每个市场去完成. 所以就出现了基类(Global)和派生类(China.USA) 定义基类(Global)Pe ...
- Java学习之反射机制及应用场景
前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...
- Android线程管理之ThreadLocal理解及应用场景
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...
- MVC常遇见的几个场景代码分享
本次主要分享几个场景的处理代码,有更好处理方式多多交流,相互促进进步:代码由来主要是这几天使用前端Ace框架做后台管理系统,这Ace是H5框架里面的控件效果挺多的,做兼容也很好,有点遗憾是控件效果基本 ...
- RabbitMq应用一的补充(RabbitMQ的应用场景)
直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...
- javascript之闭包理解以及应用场景
半个月没写博文了,最近一直在弄小程序,感觉也没啥好写的. 之前读了js权威指南,也写了篇博文,但是实话实说当初看闭包确实还是一头雾水.现在时隔一个多月(当然这一段时间还是一直有在看闭包的相关知识)理解 ...
- TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析
TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...
随机推荐
- CF1539B Love Song[题解]
Love Song 题目大意 给定长度为 \(n\) 的字符串和 \(q\) 个区间 \([l,r]\) .定义一个字符的值为该字母在字母表中的序号,对于给定的每个区间,求其中所有字符的值的和. 分析 ...
- Java程序设计(2021春)——第三章类的重用笔记与思考
Java程序设计(2021春)--第三章类的重用笔记与思考 本章概览: 3.1 类的继承(概念与语法) 3.2 Object类(在Java继承最顶层的类) 3.3 终结类和终结方法(只能拿来用,不可以 ...
- 从sql2008导入表结构及数据到mysql
打开navicat for mysql连接mysqlcreate database lianxi刷新,双击lianxi,双击"表"点击右边的"导入向导"选择&q ...
- yoyogo v1.7.6 增强程序优雅退出和K8s Readiness检查
YoyoGo (Go语言框架)一个简单.轻量.快速.基于依赖注入的微服务框架( web .grpc ),支持Nacos/Consoul/Etcd/Eureka/k8s /Apollo等 . 本次更新增 ...
- RPC远程协议之Thrift入门
在上一篇文章<RPC远程协议之原理分析>中,我介绍了RPC的工作原理及欲实现RPC框架功能应该做哪些事情,因为要做的事情太多,完全由开发人员研发实现,不是很现实,所以市面上出现了诸多RPC ...
- Python语言的技术领域
第一部分:各个领域应用的语言 大家看这个内容,其实你很明显发现,其实各个语言都有他的用处.我们可以说Python是应用最广的.但是暂时还是不能说它是全能的,因为他也有它的短板,但是对于一般的小公司和小 ...
- Spark RDD编程-大数据课设
目录 一.实验目的 二.实验平台 三.实验内容.要求 1.pyspark交互式编程 2.编写独立应用程序实现数据去重 3.编写独立应用程序实现求平均值问题 四.实验过程 (一)pyspark交互式编程 ...
- 基于SSM框架的旅游网站
介绍:spring+springmvc+mybatis三大框架,mysql数据库 功能结构图: 效果截图: 数据库表: CREATE TABLE `t_admin` ( `id` int(11) NO ...
- Requests方法 -- Token获取操作
获取token和code流程如下:a.先登陆抓包查看post(提交表单操作)头中是否有token和code关键字b.已知步骤a中出现了token和code,不登录前刷新登陆页面,查看response中 ...
- shell脚本(6)-shell数组
一.数组介绍 一个变量只能存一个值,现实中很多值需要存储,可以定义数组来存储一类的值. 二.基本数组 1.概念: 数组可以让用户一次性赋予多个值,需要读取数据时只需通过索引调用就可以方便读出. 2. ...