关于Qt半自动内存管理的思考及实验
一时兴起,对Qt感了兴趣,决心想要研究一下。
按网上资料配好环境,Windows 7 64bit + Qt 5.3.1 + VS2010.
根据《C++ GUI Qt4 编程》这本书,写出了第一个程序HelloQt,程序如下:
- #include <QApplication>
- #include <QLabel>
- #if _MSC_VER >= 1600
- #pragma execution_character_set("utf-8")
- #endif
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- QLabel *label = new QLabel("你好 Qt");
- label->adjustSize();
- label->show();
- return a.exec();
- }
发现label指针没有被delete,顿时心生疑惑,读到书后面,发现有一段:
“为简单起见,我们没有过多关注在main()函数末尾处对QLabel对象的delete操作调用。在如此短小的程序内,这样一点内在泄漏(memory leak)问题无关大局,因为在程序结束时,这部分内在是可以由操作系统重新回收的。”
话虽如此,但对于一个追求完美的严谨的程序猿来说,怎能容忍这种事情?如哽在喉,不解决心里始终放不下啊。
于是网中搜索资料,有人说,Qt采用半自动的内存管理,不像c/c++那种全需要自己delete堆内存对象,也不像java,c#那样自动垃圾回收。Qt对象继承自QObject,这个类保存一个QObject *parent指针和子对象的集合,当此Qt对象析构时,它会自动析构所有子对象。
那么本人就来验证一下,建立如下的类层次。
- #include <QCoreApplication>
- #include <QTimer>
- #include <QDebug>
- //#include "mytimer.h"
- #include "myparent.h"
- #include "myparentex.h"
- #include "myson1.h"
- #include "myson2.h"
- #if _MSC_VER >= 1600
- #pragma execution_character_set("utf-8")
- #endif
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- //MyParent *p = new MyParent(&a);
- MyParentEx *p = new MyParentEx(&a);
- MySon1 *ps1=new MySon1(p);
- MySon2 *ps2=new MySon2(p);
- ps2 = new MySon2(p);
- qDebug()<<"__________________________"<<endl;
- QTimer::singleShot(3000, &a, SLOT(quit()));
- return a.exec();
- }
输出的结果为:
- MyParent(0x152aa0) MyParent is construct.
- MyParentEx(0x152aa0) is construct.
- MySon1(0x15b520) MySon1 is construct.
- MySon2(0x15c758) MySon2 is construct.
- MySon2(0x7aeff8) MySon2 is construct.
- __________________________
- MyParentEx(0x152aa0) is destruct.
- MyParent(0x152aa0) MyParent is destruct.
- MySon1(0x15b520) MySon1 is destruct.
- MySon2(0x15c758) MySon2 is destruct.
- MySon2(0x7aeff8) MySon2 is destruct.
- Press <RETURN> to close this window...
证明,确实会自动析构。
所以使用Qt要注意,new对象时把parent带进去,否则需要自己去delete;另外就是使用栈内存对象。
关于Qt半自动内存管理的思考及实验的更多相关文章
- Qt的内存管理
在QT的程序中经常会看到只有new而不delete的情况,其实是因为QT有一套回收内存的机制,主要的规则如下: 1.所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被 ...
- MFC与Qt的内存管理
最近在做MFC向Qt的移植,在内存管理方面遇到了很头疼的问题,虽然不知道问题到底出在哪,先了解下这两个库的内存管理方式.于是转载两篇关于内存管理的文章. 一. Qt内存管理: 在Qt的程序中经常会看到 ...
- Qt的内存管理机制
当我们在使用Qt时不可避免得需要接触到内存的分配和使用,即使是在使用Python,Golang这种带有自动垃圾回收器(GC)的语言时我们仍然需要对Qt的内存管理机制有所了解,以更加清楚的认识Qt对象的 ...
- Qt 内存管理机制(转)
许转载http://devbean.blog.51cto.com/448512/526734 强类型语言在创建对象时总会显式或隐式地包含对象的类型信息.也就是说,强类型语言在分配对象内存空间时,总 ...
- 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作
一 QT的内存管理 1 QT中的内存管理是QObject来管理的 2 QT中的内存管理没有cocos2dx中的引用计数 3 组件能够指定父对象 QTimer *timer = QTime ...
- Qt 内存管理机制
这篇文章首先发布于我的主页 http://www.devbean.info,以后也会直接发布在那里.现在有 Flex 4 的一篇和 <从 C++ 到 Objective-C>系列,感谢大家 ...
- 内存管理内幕mallco及free函数实现
原文:https://www.ibm.com/developerworks/cn/linux/l-memory/ 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一.在很多脚本语言中,您不必担 ...
- <转载>内存管理内幕-动态分配的选择、折衷和实现 对malloc内存分配有个简单的描述,对内存管理有个大致的说明
这篇文章看后感觉不错,和我在glibc下的hurdmalloc.c文件里关于malloc的实现基本意思相同,同时,这篇文章还介绍了一些内存管理方面的知识,值得推荐. 原文链接地址为:http://ww ...
- Objective-C内存管理之-引用计数
本文会继续深入学习OC内存管理,内容主要参考iOS高级编程,Objective-C基础教程,疯狂iOS讲义,是我学习内存管理的笔记 内存管理 1 内存管理的基本概念 1.1 Objective-C中的 ...
随机推荐
- mysql 中添加索引的三种方法
原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...
- node.js 中createConnection参数说明
host:主机地址 (默认:localhost) user:用户名 password:密码 port:端口号 (默认:3306) database:数据库名 charset:连接字符集(默认:'UTF ...
- UNICODE串转换成char类型串的四种方法
1. 调用 WideCharToMultiByte() API int WideCharToMultiByte ( UINT CodePage, //1 U ...
- 虚函数&纯虚函数&抽象类&虚继承
C++ 虚函数&纯虚函数&抽象类&接口&虚基类 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过 ...
- (转)Android项目重构之路:实现篇
前两篇文章Android项目重构之路:架构篇和Android项目重构之路:界面篇已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单 ...
- PHP5.3下加速器ZendGuardLoader安装 (LNMP/lnmpa)
PHP5.3下加速器ZendGuardLoader安装 (LNMP/lnmpa) 由于Zend新产品ZendGuardLoader的面世,Zend Optimizer已经不支持php5.3了,官方给出 ...
- 我的自动化测试历程(Selenium+TestNG+Java+ReportNG+Jenkins)
原地址:http://blog.csdn.net/shilinjie_8952/article/details/53380373?locationNum=11&fps=1 测试环境:Java+ ...
- 帮助自定义选择框样式的Javascript - DropKick.js
来源:GBin1.com 在线演示 在线下载 当你想要设计一个页面样式时,没有什么比表单更让人头疼了.而当你设计一个表单的样式时,最让你头疼的就应该非下拉框<select>莫属了. 我们 ...
- Handler(2)
andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange). 1)Loo ...
- Win7无法安装Flash Player怎么办
在IE的工具选项中把安全选项中的ActiveX控件一系列都改为启用即可.