初學(xué)QT。我本人認為QT更是一種藝術(shù)的體現(xiàn),而非簡單的當作一個物品開看待。體現(xiàn)了人類思想的偉大。就這點而言,中國人恰恰就缺少這種創(chuàng)建型藝術(shù)細胞。或者說是,國內(nèi)缺少這種藝術(shù)創(chuàng)建的氛圍。
以下文章均為閑聊。并無技術(shù)的嚴謹性。關(guān)于其中的內(nèi)容,可能存在錯誤。請指正。
C++, Pascal,語言要求必須明確內(nèi)存的作用域,并且對創(chuàng)建的內(nèi)存區(qū)域。由程序員刪除delete。雖然存在自動模式,但并不先進
Java, SmallTalk,語言則可進行內(nèi)存碎片的自動查找分析,動態(tài)的刪除無用內(nèi)存區(qū)域。從而可以使程序員專注于程序邏輯的開發(fā)。而無須在即系統(tǒng)問題。
對于內(nèi)存的釋放存在3中方法:
1 - Let the creating object delete its child objects. 創(chuàng)建并刪除
2 - Let the last object to handle an object delete it.最后處理
3 - Don't care about memory and forget about it. 無須在意
對于第三種方法,我們稱之為"bug"。將會造成內(nèi)存的溢出。 對于程序員應(yīng)該熟悉前2種方法。
但QT則采用一種更高級的內(nèi)存管理機制.
1 - QPointer 可以監(jiān)控空間的分配狀況。以下程序,請自行分析
QDate *mydate=new QDate(QDate::currentDate());
QPointer<QDate> mypointer=mydata;
mydate->year(); // -> 2005
mypointer->year(); // -> 2005
delete mydate;
if(mydate==0) printf("clean pointer"); //mode 1
else printf("dangling pointer");
// -> "dangling pointer"
if(mypointer.isNull()) printf("clean pointer"); //mode 2
else printf("dangling pointer");
// -> clean pointer
2 - 內(nèi)存處理機制 QObjectCleanupHandler
姑且略過
3 - 碎片處理
存在幾種簡單的碎片處理機制。
a.計數(shù)器模式類似于壓棧
b.父窗口的自動回收
c.自我的回收
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下面才是最重要的(轉(zhuǎn)載)
在棧上用new分配的內(nèi)存,為什么沒有用delete釋放?
從HelloQt說起
#include <qapplication.h>
#include <qlabel.h>
int main( int argc, char **argv ){
QApplication app( argc, argv );
QLabel *label=new QLabel(“Hello QT!”,0);
app.setMainWidget( label );
label->show();
return a.exec();
}
這里label是new出來的一個指針變量,也就是在棧上申請的內(nèi)存,在C++語言里,明確過,在棧上分配的內(nèi)存是必須認為的用delete釋放的,防止內(nèi)存泄露。這里為什么沒有呢。后來看到有的QT程序也有明確使用delete釋放內(nèi)存的。這里越發(fā)不解了。后來,查到原來是QT擴展了C++,如果指針對象有父對象時,可以不用顯式釋放內(nèi)存。我們需要顯式釋放的是那些沒有父對象的孤立的指針。但上面這個例子并沒有繼承父對象,注意第二個指針,指向父對象的指針參數(shù)為0,即沒有父對象,但是setMainWidget把它設(shè)為了主窗口部件,它就和程序同步了,當程序退出的時候自動釋放,孩子對象的釋放也是如此,在QT中擴展了C++ ,如果父親對象無效時,子對象自動釋放分配的內(nèi)存。