一时兴起,对Qt感了兴趣,决心想要研究一下。

按网上资料配好环境,Windows 7 64bit + Qt 5.3.1 + VS2010.

根据《C++ GUI Qt4 编程》这本书,写出了第一个程序HelloQt,程序如下:

  1. #include <QApplication>
  2. #include <QLabel>
  3.  
  4. #if _MSC_VER >= 1600
  5. #pragma execution_character_set("utf-8")
  6. #endif
  7.  
  8. int main(int argc, char *argv[])
  9. {
  10. QApplication a(argc, argv);
  11.  
  12. QLabel *label = new QLabel("你好 Qt");
  13. label->adjustSize();
  14. label->show();
  15.  
  16. return a.exec();
  17. }

发现label指针没有被delete,顿时心生疑惑,读到书后面,发现有一段:

“为简单起见,我们没有过多关注在main()函数末尾处对QLabel对象的delete操作调用。在如此短小的程序内,这样一点内在泄漏(memory leak)问题无关大局,因为在程序结束时,这部分内在是可以由操作系统重新回收的。”

话虽如此,但对于一个追求完美的严谨的程序猿来说,怎能容忍这种事情?如哽在喉,不解决心里始终放不下啊。

于是网中搜索资料,有人说,Qt采用半自动的内存管理,不像c/c++那种全需要自己delete堆内存对象,也不像java,c#那样自动垃圾回收。Qt对象继承自QObject,这个类保存一个QObject *parent指针和子对象的集合,当此Qt对象析构时,它会自动析构所有子对象。

那么本人就来验证一下,建立如下的类层次。

  1. #include <QCoreApplication>
  2. #include <QTimer>
  3. #include <QDebug>
  4.  
  5. //#include "mytimer.h"
  6. #include "myparent.h"
  7. #include "myparentex.h"
  8. #include "myson1.h"
  9. #include "myson2.h"
  10.  
  11. #if _MSC_VER >= 1600
  12. #pragma execution_character_set("utf-8")
  13. #endif
  14.  
  15. int main(int argc, char *argv[])
  16. {
  17. QCoreApplication a(argc, argv);
  18.  
  19. //MyParent *p = new MyParent(&a);
  20. MyParentEx *p = new MyParentEx(&a);
  21.  
  22. MySon1 *ps1=new MySon1(p);
  23. MySon2 *ps2=new MySon2(p);
  24.  
  25. ps2 = new MySon2(p);
  26.  
  27. qDebug()<<"__________________________"<<endl;
  28.  
  29. QTimer::singleShot(3000, &a, SLOT(quit()));
  30.  
  31. return a.exec();
  32. }

输出的结果为:

  1. MyParent(0x152aa0) MyParent is construct.
  2.  
  3. MyParentEx(0x152aa0) is construct.
  4.  
  5. MySon1(0x15b520) MySon1 is construct.
  6.  
  7. MySon2(0x15c758) MySon2 is construct.
  8.  
  9. MySon2(0x7aeff8) MySon2 is construct.
  10.  
  11. __________________________
  12.  
  13. MyParentEx(0x152aa0) is destruct.
  14.  
  15. MyParent(0x152aa0) MyParent is destruct.
  16.  
  17. MySon1(0x15b520) MySon1 is destruct.
  18.  
  19. MySon2(0x15c758) MySon2 is destruct.
  20.  
  21. MySon2(0x7aeff8) MySon2 is destruct.
  22.  
  23. Press <RETURN> to close this window...

  

证明,确实会自动析构。

所以使用Qt要注意,new对象时把parent带进去,否则需要自己去delete;另外就是使用栈内存对象。

项目源文件

关于Qt半自动内存管理的思考及实验的更多相关文章

  1. Qt的内存管理

    在QT的程序中经常会看到只有new而不delete的情况,其实是因为QT有一套回收内存的机制,主要的规则如下: 1.所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被 ...

  2. MFC与Qt的内存管理

    最近在做MFC向Qt的移植,在内存管理方面遇到了很头疼的问题,虽然不知道问题到底出在哪,先了解下这两个库的内存管理方式.于是转载两篇关于内存管理的文章. 一. Qt内存管理: 在Qt的程序中经常会看到 ...

  3. Qt的内存管理机制

    当我们在使用Qt时不可避免得需要接触到内存的分配和使用,即使是在使用Python,Golang这种带有自动垃圾回收器(GC)的语言时我们仍然需要对Qt的内存管理机制有所了解,以更加清楚的认识Qt对象的 ...

  4. Qt 内存管理机制(转)

      许转载http://devbean.blog.51cto.com/448512/526734 强类型语言在创建对象时总会显式或隐式地包含对象的类型信息.也就是说,强类型语言在分配对象内存空间时,总 ...

  5. 6.关于QT中的内存管理,动态的制作,动态库的调用,静态库的制作

     一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件能够指定父对象 QTimer *timer = QTime ...

  6. Qt 内存管理机制

    这篇文章首先发布于我的主页 http://www.devbean.info,以后也会直接发布在那里.现在有 Flex 4 的一篇和 <从 C++ 到 Objective-C>系列,感谢大家 ...

  7. 内存管理内幕mallco及free函数实现

    原文:https://www.ibm.com/developerworks/cn/linux/l-memory/ 为什么必须管理内存 内存管理是计算机编程最为基本的领域之一.在很多脚本语言中,您不必担 ...

  8. <转载>内存管理内幕-动态分配的选择、折衷和实现 对malloc内存分配有个简单的描述,对内存管理有个大致的说明

    这篇文章看后感觉不错,和我在glibc下的hurdmalloc.c文件里关于malloc的实现基本意思相同,同时,这篇文章还介绍了一些内存管理方面的知识,值得推荐. 原文链接地址为:http://ww ...

  9. Objective-C内存管理之-引用计数

    本文会继续深入学习OC内存管理,内容主要参考iOS高级编程,Objective-C基础教程,疯狂iOS讲义,是我学习内存管理的笔记 内存管理 1 内存管理的基本概念 1.1 Objective-C中的 ...

随机推荐

  1. mysql 中添加索引的三种方法

    原文:http://www.andyqian.com/2016/04/06/database/mysqleindex/ 在mysql中有多种索引,有普通索引,全文索引,唯一索引,多列索引,小伙伴们可以 ...

  2. node.js 中createConnection参数说明

    host:主机地址 (默认:localhost) user:用户名 password:密码 port:端口号 (默认:3306) database:数据库名 charset:连接字符集(默认:'UTF ...

  3. UNICODE串转换成char类型串的四种方法

    1. 调用 WideCharToMultiByte() API int WideCharToMultiByte (     UINT    CodePage,                //1 U ...

  4. 虚函数&纯虚函数&抽象类&虚继承

    C++ 虚函数&纯虚函数&抽象类&接口&虚基类   1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过 ...

  5. (转)Android项目重构之路:实现篇

    前两篇文章Android项目重构之路:架构篇和Android项目重构之路:界面篇已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单 ...

  6. PHP5.3下加速器ZendGuardLoader安装 (LNMP/lnmpa)

    PHP5.3下加速器ZendGuardLoader安装 (LNMP/lnmpa) 由于Zend新产品ZendGuardLoader的面世,Zend Optimizer已经不支持php5.3了,官方给出 ...

  7. 我的自动化测试历程(Selenium+TestNG+Java+ReportNG+Jenkins)

    原地址:http://blog.csdn.net/shilinjie_8952/article/details/53380373?locationNum=11&fps=1 测试环境:Java+ ...

  8. 帮助自定义选择框样式的Javascript - DropKick.js

    来源:GBin1.com 在线演示  在线下载 当你想要设计一个页面样式时,没有什么比表单更让人头疼了.而当你设计一个表单的样式时,最让你头疼的就应该非下拉框<select>莫属了. 我们 ...

  9. Handler(2)

    andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange). 1)Loo ...

  10. Win7无法安装Flash Player怎么办

    在IE的工具选项中把安全选项中的ActiveX控件一系列都改为启用即可.