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,至于为什么大家可以看看源码,或者我有时间在写一下它的实现原理。

最新文章

  1. [LeetCode] Department Top Three Salaries 系里前三高薪水
  2. System.Web.Mvc.dll在各个版本MVC中的文件位置
  3. 为什么使用BeagleBoneBeagleBone的优点
  4. Visual Studio Enterprise 2015下载 Update3
  5. seajs快速了解
  6. Eclipse的模板设置代码
  7. Linux删除乱码文件
  8. SSRF攻击实例解析
  9. react-redux 学习笔记
  10. 百度预测 及 maven pom搜索地址
  11. datarow用linq查询
  12. mysql 登录中用户管理
  13. Debugging java application with netbean
  14. Tensorflow之调试(Debug)及打印变量
  15. 我对alias的重新认识:通过alias让rm更安全
  16. ffmpeg 移植到 android 并使用
  17. 使用 IntraWeb (25) - 基本控件之 TIWRegion
  18. 深入理解kafka
  19. P3455 [POI2007]ZAP-Queries
  20. encodeURIComponent编码反斜杠 \ (正则匹配)

热门文章

  1. 三、k8s集群可用性验证与调参(第一章、k8s高可用集群安装)
  2. java面向对象(下)-抽象类
  3. 【LeetCode】933.最近的请求次数
  4. Echarts入门踩坑记录
  5. Linux下Apache(HTTP)基础知识梳理-运维笔记
  6. 简单快速安装Apache+PHP+MySql服务环境(三)—— 下载安装phpmyadmin
  7. 新iPhone有望加入指纹解锁,你会买吗?
  8. 如何在VeryCD中下载资源
  9. mysql中的with rollup得到group by的汇总信息
  10. MERCY靶机