總結Qt中三大機制(二) 記憶體管理機制

2021-09-13 09:46:31 字數 902 閱讀 6354

這篇文章繼續來總結關於記憶體管理的內容。

我們知道c++中並沒有什麼記憶體管理機制。對於棧上物件我們無需關心,因為它的空間由系統負責,而堆上物件必須由程式猿負責空間的申請與釋放。qt作為第三方類庫,給出了一套很好的記憶體管理機制。

首先需要明確乙個概念,qt作為一套gui(圖形使用者介面)類庫,在開發時,我們應用最多的就是各類視窗,其中經常用到父子視窗。必須明確,父子視窗一種視窗之間的組合關係,而不是繼承中的父子類關係,兩者絕沒有任何關係。

qt中的記憶體管理:子視窗可以通過指定父視窗的方式,來託管子視窗的記憶體,而父視窗又可以通過它的父視窗來託管自己的記憶體,一層一層,頂級視窗(qwidget類物件或者其派生類widgwt物件)一般在main函式中例項化為可以自動銷毀空間的棧上物件,這樣子視窗的空間就只需手動申請而不用管釋放了。其中的底層實現大概是這樣:當父視窗釋放時,會在析構函式中遍歷自己所有的子視窗,將它們釋放。

所有的qobject類物件及其派生類物件都可以通過指定父物件來託管記憶體,qwidget繼承自qobject,所以它及其派生類物件能夠使用內管管理機制。

那麼所有的子物件只能在父物件銷毀的時候才能一起銷毀,勢必會造成記憶體駐留,能不能自己來銷毀呢?當然開發者也可以使用delete來銷毀子物件,但是不推薦這種用法,因為qobject物件遠比普通的類物件複雜的多,qobject底層實現在我們不知道的情況下,正進行著一些工作。如果這個時候使用delete強制釋放,會造成一些不可預知的錯誤。一般推薦使用deletelater函式,進行子物件的安全釋放,它會等待所有事情都處理完畢後才釋放。

[slot] void qobject::deletelater();
相對來說,記憶體管理機制是比較簡單的乙個知識點,在實際開發中也給我們帶來了極大的方便。

Qt 三大核心機制

訊號槽是qt物件間通訊的方法,主要通過connect 函式連線訊號函式和槽函式進行通訊 connect 是qobject類的乙個靜態函式 static qmetaobject connection connect const qobject sender,pointertomemberfunctio...

servlet中三大容器詳解

request 可以從請求行中獲取資料 getparameter 也可以從容器中獲取資料 在jsp頁面獲取 例如 商店 伺服器 你 客戶端 買多次物品 一次會話 session 會員卡 型別 物件名 在jsp頁面獲取相應容器的值httpservletrequest request 儲存資料 key必...

JS中三大特殊資料

nan表示不是乙個數字 not a number nan是非法運算的結果,且每乙個nan的 都不一樣,它不等於任何值,即console.log nan nan 的結果為false 如何檢驗nan?js中給我們提供了乙個檢測方法 isnan 十分語義化的應該方法,只有console.log isnan...