qt記憶體自動釋放兩個前提條件:
(1)必須是qobject的派生類 ;
(2)必須指定了qt類parent物件,則,qt 中 父類被刪除的時候會自動銷毀子類。
注意:qt的析構順序先入先出,因此在指定父類時,需要如果建立在棧上(例項化產生,棧的特性「先入後出,**先出」),需要父類在前例項化,或是堆上(new實現);
如果,new出來的且沒有指定父物件,那麼則需要手動delete刪除它。
qt記憶體管理的繫結:
(1)指標的繫結
q_invokable qobject::qobject ( qobject * parent = 0 )
//建立乙個qobject物件時,如果指定了父物件,就會將物件指標新增到父物件的 children 列表中。
(2)指標的釋放
qobject::~qobject () [virtual]
//當乙個qobject物件析構時,它會將自己從父物件的 children 列表中移除(parent非0);
(3)與父物件的解除
void qobject::setparent ( qobject * parent )
//重新指定父類
qt關聯物件的記憶體管理:
(1)指定父物件後,交由父物件管理;
(2)qwidget相關:
頂層視窗呼叫---close:應用程式銷毀該視窗部件及子部件。
非頂層視窗---close:關閉時只是隱藏,不會被銷毀。
派生控制項類:繼承與qwidget物件,可以設定 qt::wa_deleteonclose 標誌位(當close時會析構該物件)。
(3)指定父物件,手動刪除:deletelater()
原理:qt 是事件驅動的,deletelater()會傳送乙個刪除事件到事件系統:
void qobject::deletelater()
參考:
(1)(2)
QT記憶體管理
使用new操作符來定義乙個物件 qvboxlayout layout new qvboxlayout window 另外一種方法 qvboxlayout layout window c 並沒有提供記憶體自動管理機制,通常,需要程式開發人員自己去做這些事情,比如在建構函式中使用了new去申請了乙個物件...
Qt的記憶體管理
在qt的程式中經常會看到只有new而不delete的情況,其實是因為qt有一套 記憶體的機制,主要的規則如下 1.所有繼承自qobject類的類,如果在new的時候指定了父親,那麼它的清理時在父親被delete的時候delete的,所以如果乙個程式中,所有的qobject類都指定了父親,那麼他們是會...
六 Qt記憶體管理
父子關係 所有指定了父物件的qt物件 繼承自qobject類的例項 與其父物件間存在父子關係 每個qt物件都儲存有指向其所有子物件的指標 每個qt物件都有乙個指向其父物件的指標 當指定 通過建構函式指定,或通過setparent函式 qt物件的父物件時 其父物件會在子物件鍊錶中加入指向該物件的指標 ...