Qt deletelater函数分析(1)
生活的全部意义在于无穷地探索尚未知道的东西,在于不断地增加更多的知识。——左拉
该函数是QObject类的函数: -------------------------- (了解该类可以帮助深刻理解即Qt)

deletelater的原理是 QObject::deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象。
所有继承自QObejet类的类都会维护一个自己的子对象列表,同时会存储自己的父对象,所以界面中的各个控件(各个控价的基类都是QObject)可以实现层次!
“当我们使用父对象来创建一个对象的时候 ,父对象会把这个对象添加到自己的子对象列表中。当这个父对象被删除的时候,它会遍历它的子对象类表并且删除每一个子对象,然后子对象们自己再删除它们自己的子对象,这样递归调用直到所有对象都被删除。 这种父子对象机制会在很大程度上简化我们的内存管理工作,减少内存泄露的风险。所以,使用deleteLater主要作用还是减少内存泄露的风险。”
关闭一个窗口时(QQuickView, QQuickWindow,注意QQuickView的基类是QQuickWindow),建议用这个方法的deleteLater()
项目中的实例:
QQuickView* view = new QQuickView();
view->setSource(QUrl(QStringLiteral("qrc:/QML/xxx.qml")));
view->show();
关闭view时:
view->close(); //该函数会偶尔导致整个程序退出!看后面分析。可以不用它,直接掉deletelater()
view->deleteLater()
view = NULL;
调用deleteLater()后,xxx.qml中定义的对象会被销毁(析构函数被调用)。close函数仅仅是关闭页面,并不会将内存释放掉,如果不调用deleteLater函数会导致内存占用不断增加! 我在调试过程中,快速点击新建和关闭,并没有遇到deleteLater函数调用不及时的问题。
上面调用的close函数是QquickView的基类QWindow的函数,帮助文档中的解释:
“potentially quitting the application!!!!!!!!!!”---所以还是别用了

# 注意:
view->deleteLater()被调用之后需要将view这个指针置为NULL,否则就是野指针。
疑惑:如果按照上面的代码所写,会不会出现这种情况:当删除事件加入循环队列后,指针被赋值为0,接着删除事件被处理,这时因为指针为0,所以堆对象删除失败,造成了内存泄露?---- 不是!
deleteLater函数是QObject类的一个成员函数,它发出一个event给主循环,发出的事件中本身包含了需要被delete的对象的地址。
Ref:
https://www.cnblogs.com/liushui-sky/p/5852090.html https://blog.csdn.net/qq_30126571/article/details/78036576 https://blog.csdn.net/ZXHL_hxf/article/details/83410852 https://blog.csdn.net/li235456789/article/details/50599757 https://bbs.csdn.net/topics/392388844 https://blog.csdn.net/dbzhang800/article/details/6300025
Qt deletelater函数分析(1)的更多相关文章
- Qt deletelater函数分析(2)
夫唯不争,故天下莫能与之争 -- 老子 在C++中,delete 和 new 必须 配对使用,Qt作为C++的库,显然是不会违背C++原则.但是,qt有自己的内存管理,有时候虽然使用了new, ...
- Qt源码分析之QObject
原文:http://blog.csdn.net/oowgsoo/article/details/1529284 我感觉oowgsoo兄弟写的分析相当透彻,赞! 1.试验代码: #include < ...
- QT源码分析(从QApplication开始)
QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...
- 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待
在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...
- split(),preg_split()与explode()函数分析与介
split(),preg_split()与explode()函数分析与介 发布时间:2013-06-01 18:32:45 来源:尔玉毕业设计 评论:0 点击:965 split()函数可以实 ...
- string函数分析
string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...
- start_amboot()函数分析
一.整体流程 start_amboot()函数是执行完start.S汇编文件后第一个C语言函数,完成的功能自然还是初始化的工作 . 1.全局变量指针r8设定,以及全局变量区清零 2.执行一些类初始化函 ...
- uboot的jumptable_init函数分析
一.函数说明 函数功能:安装系统函数指针 函数位置:common/exports.c 二.函数分析 void jumptable_init (void) { int i; gd->jt = (v ...
- Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析
Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...
随机推荐
- 珠峰 - 郭永峰react课程 node es6 babel学习笔记
npm install babel-cli -g //安装babel babel index.js -o a.js //等同于 babel index.js --out-file a.js 复制ind ...
- python - django 控制台输出 sql 语句
只需要在 settings.py 文件中加入以下配置即可. LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers ...
- learning java 使用WatchService监控文件变化
import java.io.IOException; import java.nio.file.*; public class WatchServiceTest { public static vo ...
- C++对象内存布局,this指针,对象作为参数,作为返回值
class TestClass { public: void setNum(int num) { m_num1 = num; } int getNum() { return m_num1; } pri ...
- CORS跨域资源共享总结
1.CORS简述 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源(协议 + 域名 + 端口)服务 ...
- QQ for Mac聊天纪录怎么查找??
在你Mac上打开你的QQ,选择任意聊天窗口,打字的上面有6个图表快捷键,第6个就是查看聊天记录的功能键
- tomcat9源码导入idea
maven部署 下载源码 tomcat最新版的github地址 tomcat9官网下载 步骤 源码根目录新建 home 文件夹 把 conf 文件夹和 webapps 文件夹移动到 home 文件夹 ...
- es6学习3:promise
promise含义: 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. 从语法上说,Promise 是一个对象,从它可以获取异步操作的消息.Pro ...
- Python中为什么没有++和–(自增/减)(转)
原文地址:http://blog.csdn.net/guang09080908/article/details/47273775(侵删) 这两天看了一些网上各大互联网公司的面试题,发现腾讯特别喜欢考察 ...
- IDEA将指定package(指定文件)打成jar包
写在前面 真的是好记性不如烂笔头 需求 将项目中包名为org的package打成jar包 步骤 1.选择Artifacts>绿色+号>JAR>Empty name自定义, 我这里命名 ...