QT子窗體占用系統資源的釋放問題

2021-07-09 11:22:09 字數 1497 閱讀 9878

qt中當主窗體退出時,子窗體占用的系統資源將自動釋放。但是,如果主窗體退出前,連續開啟關閉子窗體,那麼子窗體占用的系統資源將越來越多,並不進行釋放。(這點可以通過任務管理器對程式使用的記憶體大小變化進行觀察得到。)

為了能夠使子窗體自動釋放系統資源,需要在子窗體類中新增這樣一句:

this->setattribute(qt::wa_deleteonclose,true);

來使子窗體退出時自動釋放系統資源。它其實是在子窗體的closeevent()函式中對窗體資源進行了刪除,可以理解為進行了delete this;操作。但是我在過載了closeevent()函式的窗體類的建構函式中新增了this->setattribute(qt::wa_deleteonclose,true);這樣的語句並沒有實現窗體占用的資源釋放。後來我在窗體的closeevent()函式的最後新增了一句:delete this;就可以實現窗體資源的自動釋放了。當子窗體釋放資源的時候,由於子窗體和其上的元件是父子關係,從而窗體上的元件占用的資源不需要我們手動釋放,由子窗體自動釋放。

總結:1)若要實現子窗體占用系統資源的釋放,要在建構函式中新增this->setattribute(qt::wa_deleteonclose,true);

2)若過載了closeevent()函式,則需要在此函式的最後新增delete this;進行資源的釋放。

1. 對於使用指標,使用new建立的視窗,當然可以使用delete顯示的釋放其占用的資源:

widget *w = new widget();

delete w;

2. 對於使用指標,使用new建立的視窗,還可以使用qwidget::setattribute方法來當視窗關閉後自動釋放其占用的資源,而不使用者顯示的去呼叫delete釋放,此方法當然也會呼叫視窗的析構函式:

widget *w = new widget();

w->setattribute(qt::wa_deleteonclose);

這可以用於非模態對話方塊,因為

非模態對話方塊如果是用指標形式建立,但是再接著delete的話,視窗就沒了,如果不使用delete釋放視窗占用的資源,又會贊成洩漏。如果使用普通變數建立,同樣的也因為變數作用域馬上就結束而視窗也沒了,另一種方法就是使用多執行緒,不過這個的代價大了點。所以這種技術在建立非模態對話方塊上是非常典型的運用。

測試方式:在widget中分配大量的記憶體,顯示與關閉多個此類視窗,看看任務管理器裡此程式的記憶體變化情況,是否真正的釋放了占用的記憶體(當然釋放了)。在c++中使用new分配記憶體時,如array = new double[length],此時,給array的記憶體實際上並沒有真正的分配,必須等到第一次使用這些記憶體後才會真正地為其分配物理記憶體,如:memset(array, 1, length * sizeof(double))

3. 視窗的記憶體管理交給父widget:

widget *w = new widget(parent);

但這時,如果父widget不結束,這個視窗的資源一直會占用著。

至於使用哪種技術來釋放視窗的資源,要看具體的運用時,哪種方式更合適。

QT子窗體占用系統資源的釋放問題

qt 中當主窗體退出時,子窗體占用的系統資源將自動釋放。但是,如果主窗體退出前,連續開啟關閉子窗體,那麼子窗體占用的系統資源將越來越多,並不進行釋放。這點可以通過任務管理器對程式使用的記憶體大小變化進行觀察得到。為了能夠使子窗體自動釋放系統資源,需要在子窗體類中新增這樣一句 this setattr...

Linux檢視系統資源占用

在系統維護的過程中,隨時可能有需要檢視 cpu和記憶體的使用率,並根據相應資訊分析系統狀況的需求。本文介紹一下幾種常見的linux系統資源檢視命令。1 總體記憶體占用的檢視 命令 free 圖1 free命令檢視記憶體占用 1 free命令預設是以kb為單位顯示的,可以用free m 用mb單位來顯...

檢視程序占用系統資源的方法

用ps命令檢視程序的記憶體 ps命令是linux下常見的檢視程序狀況的程式,它有幾個字段可以用來檢視 程序記憶體使用情況 sz,rss,vsz。分別說明如下 sz 程序映像所占用的物理頁面數量,也就是以物理頁面為單位表示的虛擬記憶體大小 rss 程序當前所占用的物理記憶體大小,單位為kb vsz 程...