在c++中學習過程中,我們都知道:
qt作為c++的庫,顯然是不會違背c++的前述原則的。可是:
注:本文暫不涉及智慧型指標(smart pointer)相關的東西,你可以考慮 qt 智慧型指標學習 一文
在qt中,以下情況下你new出的物件你可以不用親自去delete (但你應該清楚delete在何處被qt呼叫的,怎麼被呼叫的):
除此之外,有些類的物件可以接收設定一些特別的標記,比如:
在qt中,每個 qobject 內部都有乙個list,用來儲存所有的 children,還有乙個指標,儲存自己的parent。當它自己析構時,它會將自己從parent的列表中刪除,並且析構掉所有的children。
q_invokable qobject::qobject ( qobject * parent = 0 )
qobject::~qobject () [virtual]
void qobject::setparent ( qobject * parent )注:這三個函式都是通過乙個內部私有函式來實現的,這就是
qobjectprivate::setparent_helper(qobject *o)每個qobject只有乙個父物件:
qobject * qobject::parent () const子物件可以有多個
const qobjectlist & qobject::children () const所以可以根據條件來查詢嘍:
t qobject::findchild ( const qstring & name = qstring() ) constdeletelater 包含兩層意思了qlistqobject::findchildren ( const qstring & name = qstring() ) const
呵呵,似乎這是廢話哈。
在去年春節前的時候吧,有人對
obj-> deletelater()會像下面一樣呼叫delete:
delete obj;感到不解。然後我寫了這樣乙個c++例子:
class a應該不需要解釋吧void deleteme()
};int main()
qt 是事件驅動的,所以傳送乙個刪除事件到事件系統就可以啦:
void qobject::deletelater()事件迴圈稍後看到該事件就會將其派發會這個widget:
bool qobject::event(qevent *e)這是 c++ gui programming with qt 4 一書的第乙個例子。我們注意到這兒的 label 既沒有指定parent,也沒有對其呼叫delete。
所以,這兒會造成記憶體洩露。
書中解釋說,對於這種小例子,這點記憶體洩露不算什麼。不清楚官方這個例子的意圖是什麼,或許是一開始就讓大家用指標吧。
三種改進方式
qlabel label("hello qt!");
label.show();
label->setattribute(qt::wa_deleteonclose);delete label;
return ret;強化一下對前乙個例子的了解
執行正常,退出時會崩潰,因為label被close時,將會 delete 這兒label物件,但label物件卻不是通過new分配到heap中的。
為了使得使用者減少自己顯式使用delete,qt將delete隱藏的比較深。這樣一來,不使用new為物件分配空間時,反倒需要多多小心了。
看個小例子:這個程式退出時會直接崩潰。
#include int main(int argc, char* argv)
qlabel label();delete &label;
qlabel *label = new qlabel("hello qt!");label.setparent(&w)
qwidget w;qt 物件的父子關係的引入,簡化了我們對記憶體的管理,但是,由於它會在你不太注意的地方呼叫 delete,所以,使用時還是要當心。qlabel label(tr"hello qt!");
物件銷毀 unity 物件銷毀報錯
其中 radarparent 物件是radarroot 這個gameobject.報錯前提 執行場景切換 報錯位置 villagegameui 執行ondestroy的時候radarparent null,執行到 radar.setparent radarparent 觸發異常 報錯原因 radar...
Qt 銷毀機制
首先了解這些對windows程式設計有更深入的理解,其實就是從qt在windwos上就是win32的擴充套件了一下,一般程式退出後,即使不delete你分配的記憶體,作業系統也會幫著 qt有著半自動的 機制,為什麼是半自動呢?個人理解如下,qt中的一切事件,圖形等都是經過qobject派生出來的,每...
GC Roots演算法中物件的銷毀過程
在根搜演算法中不可達的物件也並非是非死不可 真正宣告乙個物件的死亡至少要經歷兩次標記的過程 如果物件在進行跟搜尋後發現沒有與gc roots相連線的引用鏈那它將會被第一次標記並且進行一次篩選 篩選條件 此物件是否有必要執行finalize 方法 當前物件沒有重寫finalize 方法,或者final...