QPointer是Qt提供的一个智能指针(严格来说半智能),专门为自动释放内存资源而设计的。

QPointer所指向的对象必须是QObject或其派生类对象当其指向的对象被销毁时,它会被自动置NULL,但是delete还是必须手动处理。

#include <QCoreApplication>
#include <QTimer>
#include <QDebug>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTimer *timer = new QTimer;delete timer;if(timer){qInfo()<<"timer is not null";}else{qInfo()<<"timer is null";}return a.exec();
}

此时,输出“Label is not null”,原因是,delete后未置空,易造成野指针。

当用智能指针时,将QTimer *改为Qpointer<QTimer>即可,此时如下:

#include <QCoreApplication>
#include <QTimer>
#include <QDebug>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//QTimer *timer = new QTimer;QPointer<QTimer> timer = new QTimer;delete timer;if(timer){qInfo()<<"timer is not null";}else{qInfo()<<"timer is null";}return a.exec();
}

此时输出,timer is null。

总之delete和置空nullptr是对应的,但是实际情况中在经过复制之后很容易造成部分未置空的情况。

#include <QCoreApplication>
#include <QTimer>
#include <QDebug>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QTimer *timer = new QTimer;//QPointer<QTimer> timer = new QTimer;QTimer *timer2 = timer;delete timer;timer=NULL;if(timer){qInfo()<<"timer is not null";}else{qInfo()<<"timer is null";}if(timer2){qInfo()<<"timer2 is not null";}else{qInfo()<<"timer2 is null";}return a.exec();
}

改成智能指针,如下:

#include <QCoreApplication>
#include <QTimer>
#include <QDebug>
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);//QTimer *timer = new QTimer;QPointer<QTimer> timer = new QTimer;//QTimer *timer2 = timer;QPointer<QTimer> timer2= timer;delete timer;//timer=NULL;if(timer){qInfo()<<"timer is not null";}else{qInfo()<<"timer is null";}if(timer2){qInfo()<<"timer2 is not null";}else{qInfo()<<"timer2 is null";}return a.exec();
}

额外:

在QPointer中 .和-> 是不一样的。前者是指针的属性,后者才是对象的属性。

8-Qt6 智能指针QPointer相关推荐

  1. 61、智能指针类模板

    1.智能指针 智能指针的意义 - 现代C++开发库中最重要的类模板之一 - C++中自动内存管理的主要手段 - 能在很大程度上避开内存相关的问题 STL中的智能指针 auto_ptr(#include ...

  2. Linux 内核里的“智能指针”【转】

    转自:http://blog.jobbole.com/88279/ 众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异 ...

  3. Linux 内核里的“智能指针”

    Linux 内核里的"智能指针" from: http://begeek.cn/post/7889.html?ref=myread 众所周知,C/C++语言本身并不支持垃圾回收机制 ...

  4. Qt智能指针--QSharedPointer

    文章目录 前言 QSharedPointer 值得一提 前言 Qt智能指针QSharedPointer 与 C++中的std::shared_ptr其作用是一样的,其应用范围比我们前面说到的QPoin ...

  5. Qt智能指针--QScopedPointer

    文章目录 概述 QScopedPointer const 限制 考虑一种情况 QScopedArrayPointer 概述 前一篇文章我们详细的介绍了QPointer的用法,那么,这里继续总结Qt的另 ...

  6. Qt 之 智能指针汇总

    来源 还有其他一些,做了一些汇总和测试,就不全列了. 文章目录: 一.垂悬指针的问题 二.Qt中的智能指针        1.QPointer        2.QSharedPointer & ...

  7. 指针中的战斗机---智能指针!!!

    指针是C语言中的精髓,智能指针是C++中的王炸! 温故知新,可以为师.在开启智能指针学习篇章前,先来探望老朋友-C语言中的精髓-指针.指针的本质是变量,何为变量,变量就是用特定的数据类型做的moonc ...

  8. Qt源码剖析-智能指针

    目录 智能指针是什么? 为什么使用QT智能(smart)指针? Qt提供了哪些智能指针? QSharedPointer类模板(smart指针类)源码分析 1. QSharedPointer类模板对于模 ...

  9. 【QT小记】QT中智能指针的使用

    自定义两个类 class OnePiece { public:OnePiece() {qDebug() << QString("构造OP");}~OnePiece() ...

最新文章

  1. Linux上用户执行命令记录
  2. Quadrant TableViewCell
  3. linux 系统调用 hook 总结
  4. 人生三部曲:顺序,选择,循环
  5. Chargen DoS攻击
  6. .net core 2.1 mysql_ASP.NET Core 2.2 + MySQL + DB First
  7. hdu 4612 边连通度缩点+树的最长路径
  8. VMware vCenter Converter 关闭SSL加密,提高35-40%性能
  9. andriod studio 查看项目依赖_如何实施CRM项目管理
  10. Sqlite3 数据库基本操作
  11. 第 15 章 垃圾回收相关算法
  12. SpringMVC——处理方法返回值的可选类型
  13. pycharm 虚拟环境virtualenv迁移到别的机器 无法读取包的问题
  14. JavaWeb基础教程
  15. 1. C语言---输出格式大全
  16. OpenGL开启Gouraud明暗处理,减少马赫夫效应
  17. 解决拉取远程分支后出现.xcodeproj Couldn't load project的问题
  18. cgb2107-day07
  19. 微信奇销36计 赖老师
  20. AI人工智能毕业设计课题:人脸识别,人脸识别系统,人脸识别考勤系统

热门文章

  1. 青瓷游戏上市首日破发,“元宇宙光环”能否拯救年内首支游戏股?
  2. 双11的前奏,电商正在用诺贝尔经济学奖的理论等你下锅
  3. c语言怎样判断键盘 输入法,如何快速的认识键盘和正确的使用键盘
  4. strstr c语言字符串,C字符串处理strstr, strindex
  5. html与js与mysql_从本地html / javascript网站插入mySQL数据库
  6. 关于解决安装pwndbg问题sys.stderr.write(f“ERROR: {exc}“) /usr/bin/python3.5: No module named ensurepip
  7. Python中九种格式化输出方法,你都知道吗?
  8. python基础中apply()函数的正确用法
  9. Python基础教程:七种运算符
  10. Python文件操作中进行字符串替换(保存到新文件/当前文件)