• 关于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;另外就是使用栈内存对象。

     项目源文件

  • 相关阅读:
    ----Vue 单页应用的首屏优化----
    ----小程序之rich-text图片宽度自适应----
    ----vue-router 如何在新窗口打开页面----
    ----element-ui实现时间控件开始时间和结束时间关联----
    ----element-ui自定义表单验证----
    ----js中的every和some----
    「Linux学习」之挂载访问samba服务
    「Linux学习」之samba和nfs共享服务搭建
    「Linux学习」之防火墙服务设置
    「linux学习」之批量创建用户脚本
  • 原文地址:https://www.cnblogs.com/wucg/p/3878611.html
Copyright © 2020-2023  润新知