关于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半自动内存管理的思考及实验

时间: 2024-08-01 16:52:19

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

Qt的内存管理

在QT的程序中经常会看到只有new而不delete的情况,其实是因为QT有一套回收内存的机制,主要的规则如下: 1.所有继承自QOBJECT类的类,如果在new的时候指定了父亲,那么它的清理时在父亲被delete的时候delete的,所以如果一个程序中,所有的QOBJECT类都指定了父亲,那么他们是会一级级的在最上面的父亲清理时被清理,而不用自己清理: 2.程序通常最上层会有一个根的QOBJECT,就是放在setCentralWidget()中的那个QOBJECT,这个QOBJECT在 new的

内存管理的思考方式2(ARC下)

所有权修饰符 所有权修饰符共有四种 __strong __weak __unsafe_unretained __sutoreleasing __strong修饰符 是id类型和对象类型默认的所有权修饰符,通过__strong修饰符,不必再次键入retain或者release,完美的满足了'引用计数式内存管理的思考方式': 自己生成的对象自己持有 非自己生成的对象,自己也可以持有 不再需要自己持有的对象时释放 非自己持有的对象无法释放 前两项只需通过对带__strong修饰符的变量赋值即可达成.通

Qt的内存管理机制

当我们在使用Qt时不可避免得需要接触到内存的分配和使用,即使是在使用Python,Golang这种带有自动垃圾回收器(GC)的语言时我们仍然需要对Qt的内存管理机制有所了解,以更加清楚的认识Qt对象的生命周期并在适当的时机加以控制或者避免进入陷阱. 这篇文章里我们将学习QObject & parent对象管理机制,以及QWidget与内存管理这两点Qt的基础知识. QObject和内存管理 在Qt中,我们可以大致把对象分为两类,一类是QObject和它的派生类:另一类则是普通的C++类. 对于第

Qt 半内存管理

在C++中学习过程中,我们都知道: delete 和 new 必须配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大. Qt作为C++的库,显然是不会违背C++的前述原则的.可是: 在Qt中,我们很多时候都疯狂地用new,却很少用delete,缺少的 delete 去哪儿了?! 注:本文暂不涉及智能指针(smart pointer)相关的东西,你可以考虑 Qt 智能指针学习 一文 Qt半自动的内存管理 在Qt中,以下情况下你new出的对象你可以不用亲自去delete (但你应该清

内存管理的思考模式

自己生成的对象,自己所持有 使用以下名称开头的方法名意味着自己生成的对象只有自己持有 alloc new copy mutableCopy 下列名称也意味着自己生成并持有对象 allocMyObject newThisObject copyThis mutableCopyYourObject 但是对于以下方法名称,即使用alloc/new/copy/mutableCopy名称开头,并不属于同一类别的方法 allocate newer copying mutableCopyed 非自己生成的对象,

Qt 内存管理机制

这篇文章首先发布于我的主页 http://www.devbean.info,以后也会直接发布在那里.现在有 Flex 4 的一篇和 <从 C++ 到 Objective-C>系列,感谢大家支持! 强类型语言在创建对象时总会显式或隐式地包含对象的类型信息.也就是说,强类型语言在分配对象内存空间时,总会关联上对象的类型.相比之下,弱类型 语言则不会这样做.在分配了内存空间之后,有两种方法释放空间:手工释放,或者是使用垃圾收集器.C++ 要求开发者手工释放内存空间.这样做的好处是,开发者对内存有完全

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

 一  QT的内存管理 1  QT中的内存管理是QObject来管理的 2  QT中的内存管理没有cocos2dx中的引用计数 3  组件可以指定父对象 QTimer *timer = QTimer(this);   //这里的this实际上强制转换成为了QObject了. 4  每一个对象都有一个deleteLater()方法, QLineEdit* edit = new QLineEdit(this); delete edit;   //这里的delete马上调用析构函数对内存进行释放

linux内存管理内幕

原文地址:http://blog.csdn.net/wangyuling1234567890/article/details/39609863 忽然想起前几天在公司看到一篇关于内存管理的文章,但当时由于别的事情给打断了.今天想起来,就又在网上找了一下,与大家分享一下. 虽然自己现在从事内核模块开发,对内存池和引用计数也有所了解,但由于理解深度及文笔,不能自己娓娓道来,所以就和大家一起来瞻仰一下大师给我们的讲解. 以下内容来自于http://www.ibm.com/developerworks/c

谈谈ios内存管理--持续更新

本文主要谈谈ios内存管理的发展脉络,不足之处,还请指教,相互学习交流.做ios开发,永远无法避开内存管理,无论我们是否有意识去考虑这个事情,但是只要我们写了OC程序,那么就与内存管理有关. 一.内存管理是做什么的? 二.内存管理方式一:MRC (一)引用计数器 (二)原则 (三)alloc.new.copy.mutableCopy.retain.release.dealloc alloc内部实现 引用计数表 (四)autorelease 三.内存管理方式二:ARC (一)__strong (二