關於Qt半自動記憶體管理的思考及實驗

來源:互聯網
上載者:User

標籤:des   blog   http   java   使用   os   strong   檔案   

一時興起,對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個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.