首页 > 代码库 > 关于Qt半自动内存管理的思考及实验
关于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")#endifint 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")#endifint 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;另外就是使用栈内存对象。
项目源文件
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。