六 Qt記憶體管理

2021-07-26 15:31:51 字數 1665 閱讀 2218

父子關係:

所有指定了父物件的qt物件(繼承自qobject類的例項)與其父物件間存在父子關係:

每個qt物件都儲存有指向其所有子物件的指標

每個qt物件都有乙個指向其父物件的指標

指定(通過建構函式指定,或通過setparent函式)qt物件的父物件時:

其父物件會在子物件鍊錶中加入指向該物件的指標

該物件會儲存指向其父物件的指標

當qt物件被銷毀時

該物件會將自己從父物件的子物件鍊錶中移除

該物件會將自己的子物件鍊錶中所有子物件銷毀

通過父子關係得到qt物件樹,刪除樹中的節點時會導致對應的子樹被銷毀

設定屬性:

如:qwidget及其子類物件,可以設定qt:: wa_deleteonclose,此後,當被close時便自動銷毀(delete)

使用函式qobject類的成員函式deletelater():

使用此函式後銷毀操作不會立即執行,而是當qt物件返回事件迴圈時執行銷毀操作(如果事件迴圈未開始,將立即執行銷毀操作),多次呼叫此函式是安全的

注意:(1)想要設定qt::wa_deleteonclose,被設定物件必須位於堆,否則觸發delete時會作用在棧上,程式將會崩潰

(2)、盡量依靠qt物件間的父子關係銷毀物件,不要手動去delete。正常情況下,發生delete時,被delete的父物件會知道這個事情,並會將被delete的子物件從其子物件鍊錶移除,但如果乙個qt物件正在接受事件佇列的中途被delete,結果可能是記憶體的多次釋放,如果一定要銷毀,使用deletelater()

(3)、盡量不要在乙個qt物件的父物件之外持有指這個qt物件的指標,因為這個指標在某些時刻指向的qt物件可能已經被銷毀,應該使用智慧型指標qpointer(此指標會在其指向的qt類物件(只能指向qobject及其子類物件)被銷毀時自動置null)

(4)、注意乙個因為父子關係而引出的問題:

#include

int main(int argc, char *argv)

qlabellabel("hi");

qwidgetw;

label.setparent(&w);

w.show();

returna.exec();

問題在於:退出時w比label先析構,w是label的父物件,由於父子關係,w析構時,其操作之一是銷毀子物件(執行delete),而label是棧物件,這一動作將導致程式崩潰,解決辦法(1)、使label物件在堆上建立

(2)、確保label比w先被析構,label會將自己從w的子物件鍊錶中移除,w析構時其子物件鍊錶中已經不存在label

將**的順序改為:

qwidget w;

qlabel label("hi");

宣告:此文根據 狄泰學院唐老師的《qt實驗分析教程》創作,並根據自身理解對其進行了少許的擴充套件

QT記憶體管理

使用new操作符來定義乙個物件 qvboxlayout layout new qvboxlayout window 另外一種方法 qvboxlayout layout window c 並沒有提供記憶體自動管理機制,通常,需要程式開發人員自己去做這些事情,比如在建構函式中使用了new去申請了乙個物件...

六 記憶體管理

殭屍物件 已經被釋放的物件。再使用物件就會報錯。野指標 乙個指標指向被釋放的物件的記憶體。前提 相對於mrc下,一次 retain alloc 對應一次release,經常需要手動release進行記憶體管理,防止記憶體洩漏。從而引出自動釋放池 自動釋放池 自動釋放池是以棧為節點通過雙向鍊錶組合而成...

Qt的記憶體管理

在qt的程式中經常會看到只有new而不delete的情況,其實是因為qt有一套 記憶體的機制,主要的規則如下 1.所有繼承自qobject類的類,如果在new的時候指定了父親,那麼它的清理時在父親被delete的時候delete的,所以如果乙個程式中,所有的qobject類都指定了父親,那麼他們是會...