关于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中的 ...
随机推荐
- 在XC2440上实现使用U盘自动更新系统的uboot
转:http://blog.chinaunix.net/uid-22030783-id-3347599.html 此版本uboot在XC2440_uboot_V1.3版本上修改得来,是为我们的一个大客 ...
- Objective-C字面量语法总结
通常情况下,创建数组,字典的时候需要写一些很长的方法名,今天就总结一下如何使用字面量语法代替这些方法. 1.数值的创建 NSNumber *number1 = [NSNumber numberWith ...
- Docker从12升级到17ce
先卸载 yum remove docker* yum remove container-selinux--.el7.centos.x86_64 安装 sudo yum install -y yum-u ...
- lumisoft邮件头不规范造成内容无法读取
解决邮件内容为multipart,并且Param_Boundary等于null的不规范邮件内容无法读取问题,这样的邮件内容头部往往带两个或多个ContentType. 红色为自己加的,绿色为注释掉原来 ...
- Android(Fragment和Activity之间通信)
Fragment的使用可以让我们的应用更灵活的适配各种型号的安卓设备,但是对于Fragment和Activity之间的通信,很多朋友应该比较陌生,下面我们就通过一个实例来看一看如何实现. 一.Acti ...
- http://blog.sina.com.cn/s/blog_4dd787e40102uysg.html
http://blog.sina.com.cn/s/blog_4dd787e40102uysg.html
- LightOJ - 1265 Island of Survival 期望
题目大意:有一个生存游戏,里面t仅仅老虎,d仅仅鹿,另一个人,每天都要有两个生物碰面,如今有下面规则 1.老虎和老虎碰面.两仅仅老虎就会同归于尽 2.老虎和人碰面或者和鹿碰面,老虎都会吃掉对方 3.人 ...
- C#-遍历datatable的几种方法
遍历datatable的方法2009-- :02方法一: DataTable dt = dataSet.Tables[]; ; i < dt.Rows.Count ; i++) { string ...
- 算法笔记_058:蓝桥杯练习 2的次幂表示(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面 ...
- .gitignore 里面常写的值
一般用这个文件来控制一些不想提交的内容 这个可以做一个参考 # Windows image file caches Thumbs.db ehthumbs.db # Folder config fi ...