QT中什麼時候delete

2021-06-22 19:33:02 字數 2190 閱讀 6374

在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() ) const

qlistqobject::findchildren ( const qstring & name = qstring() ) const

deletelater 包含兩層意思了

呵呵,似乎這是廢話哈。

在去年春節前的時候吧,有人對

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;

qlabel label(tr"hello qt!");

qt 物件的父子關係的引入,簡化了我們對記憶體的管理,但是,由於它會在你不太注意的地方呼叫 delete,所以,使用時還是要當心。

在c 中, 什麼時候用 什麼時候用

在某種意義上,和 是意思相對的兩個東西,把它們放在一起有什麼意義呢?為了理解指標的這種做法,我們先複習一下c c 程式設計中無所不在的指標概念。我們都知道myclass 的意思 指向某個物件的指標,此物件的型別為myclass。void func1 myclass pmyclass 例如 mycla...

什麼時候用exists 什麼時候用in

in not in exists not exists 使用exists,oracle會首先檢查主查詢,然後執行子查詢直到它找到第乙個匹配項,這就節省了時間。oracle在執行in子查詢時,首先執行 子查詢,並將獲得的結果列表存放在乙個加了索引的臨時表中。在執行子查詢之前,系統先將主查詢掛起 待子查...

Ajax中什麼時候用同步,什麼時候用非同步?

ajax中根據async的值不同分為同步 async false 和非同步 async true 兩種執行方式 在w3c的教程中推薦使用非同步執行 ajax function2 預設情況下async是true 一.什麼是同步請求 false 同步請求即是當前發出請求後,瀏覽器什麼都不能做,必須得等到...