QT QPointer 解析

使用qt 很久,只知道QPointer,但是在项目中很少用到,说到底还是没有对于QPointer了解不够透彻,所以在使用过程中才没有去使用,好吧,就是那种,不懂就不用,反正其他的方式能够满足需求,但是这不是我们想要的,它的出现必然有它的原因,肯定有很多我所不了解的优点,今天来重新学习一下,let's go!

QPointer类是一个模板类,是为了QObject提供的一种监视指针。先来看一下普通C++与QPointer指针声明方式有什么不同。

普通C++指针声明方式: T* p1;

QPointer指针声明方式:QPointer <T> p2;

它们的最大不同就是:

当QPointer p2 指针引用的对象被销毁时候,p2指针会自动指向NULL,

而p1的引用对象如果被销毁,p1则不会自动指向NULL,而是会变成野指针。

解释一下就是当p1引用别的对象A,而这个对象A在别的地方可能一不小心被销毁了,而p1还在指向这块内存,p1的值是没有变的,可是p1指向的这块内存已经不是以前的对象A了,这时候再调用p1就相当于变成了野指针,操作的时候会引起不可预测的风险。这时候QPointer指针就会变得很有用,当p2指向的对象销毁了,p2会自动指向NULL,而不会变成野指针。

我们来看下一段代码

QList <QWidget*> listA;

QList <QWidget*> listB;

QWidget *w1 = new QWidget;

QWidget *w2 = new QWidget;

QWidget *w3 = new QWidget;

listA.append(w1);

listA.append(w2);

listA.append(w3);

listB.append(w1);

listB.append(w2);

listB.append(w3);

foreach (QWidget *w, listA)

{

if(w)

{

listA.removeOne(w);

delete w;

w = NULL;

qDebug() << "listA is not null";

}

else

qDebug() << "listA is null";

}

foreach (QWidget *w, listB)

{

if(w)

{

qDebug() << "listB is not null";

}

else

qDebug() << "listB is null";

}

这时候我们来猜测一下结果,第一个foreach的时候,判断如果listA里的成员指向不为空,就删除此成员,并置为空,所以前三句应该都是"listA is not null";

重点来看第二个foreach,来判断listB中的成员指向是否为空,到此为止,listB中的值始终是没有变得,也就是它里面的指针不为空,所以打印出来的应该是"listB is not null" 才对。结果是怎样的呢?

那么怎样避免这种情况呢,QPointer的作用就出现了。我们来变换一下刚才的代码:

QList <QPointer<QWidget>> listA;

QList <QPointer<QWidget>> listB;

QPointer<QWidget> w1 = new QWidget;

QPointer<QWidget> w2 = new QWidget;

QPointer<QWidget> w3 = new QWidget;

listA.append(w1);

listA.append(w2);

listA.append(w3);

listB.append(w1);

listB.append(w2);

listB.append(w3);

foreach (QPointer<QWidget> w, listA)

{

if(w)

{

listA.removeOne(w);

delete w;

w = NULL;

qDebug() << "listA is not null";

}

else

qDebug() << "listA is null";

}

foreach (QPointer<QWidget> w, listB)

{

if(w)

{

qDebug() << "listB is not null";

}

else

qDebug() << "listB is null";

}

那么结果会是怎样的呢?

我们发现了,使用了QPointer之后,对于第一个foreach结果是没变化的,当到第二个foreach的时候,listB就算里面的内容没有边,依然能判断出来listB中的成员自动都指向了NULL,这就是QPointer的最大作用!


原文链接:https://blog.csdn.net/xiezhongyuan07/article/details/80263614

相关推荐
这是程序猿11 小时前
Java线程池深度剖析:源码原理、核心参数、任务调度与生产调优实战
java·开发语言·python
quantdash_cc11 小时前
从数据采集到策略消费,股票日内行情管道应该怎么设计?
开发语言·python·数据分析·量化交易·股票数据·quantdash
郝学胜-神的一滴12 小时前
C++20模板元编程 01:从零吃透模板核心底层逻辑
开发语言·c++·vscode·程序人生·开源
可乐鸡翅yeah_12 小时前
HLS流媒体首屏起播慢深度优化,从分片、索引、播放器全链路调优
开发语言·javascript·ecmascript·m3u8·m3u8在线
luj_176812 小时前
生物体如何应对功能击穿?
c语言·开发语言·c++·经验分享·算法
luj_176812 小时前
击穿分析五大关键步骤
开发语言·网络·c++·经验分享·算法
wuyk55512 小时前
从零吃透 MQTT 通信|第 11 章 MQTT 项目调试验证、性能优化、常见疑难问题、OTA 升级基础
c语言·开发语言·stm32·学习·性能优化
海盗123412 小时前
微软技术日报 2026-09-14:Rust 升为微软一级语言,云业务重组为智能体与基础设施
开发语言·microsoft·rust
名字还没想好☜13 小时前
Python 的 __call__ 实战:让实例像函数一样被调用,做带状态计数器、缓存器与可配置策略
开发语言·后端·python·缓存·编程语言
skywalk816313 小时前
第 23 轮方向确定:保护表通用化替代轮。先深入探查剩余保护表依赖场景和任务 6 的四阶段路径,再写任务书。9.14
开发语言·人工智能·光明