標籤: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;另外就是使用棧記憶體對象。
項目源檔案