1. 程式人生 > >深入剖析Qt記憶體洩漏(總結)

深入剖析Qt記憶體洩漏(總結)

一、簡介
Qt記憶體管理機制:Qt 在內部能夠維護物件的層次結構。對於可視元素,這種層次結構就是子元件與父元件的關係;對於非可視元素,則是一個物件與另一個物件的從屬關係。在 Qt 中,在 Qt 中,刪除父物件會將其子物件一起刪除。

C++中delete 和 new 必須配對使用(一 一對應):delete少了,則記憶體洩露,多了麻煩更大。Qt中使用了new卻很少delete,因為QObject的類及其繼承的類,設定了parent(也可在構造時使用setParent函式或parent的addChild)故parent被delete時,這個parent的相關所有child都會自動delete,不用使用者手動處理。但parent是不區分它的child是new出來的還是在棧上分配的。這體現delete的強大,可以釋放掉任何的物件,而delete棧上物件就會導致記憶體出錯,這需要了解Qt的半自動的記憶體管理。另一個問題:child不知道它自己是否被delete掉了,故可能會出現野指標。那就要了解Qt的智慧指標QPointer。

二、關聯圖

(1)Linux記憶體圖,主要了解堆疊上分配記憶體的不同方式。
在這裡插入圖片描述
(2)在Qt中,最基礎和核心的類是:QObject,QObject內部有一個list,會儲存children,還有一個指標儲存parent,當自己析構時,會自己從parent列表中刪除並且析構所有的children。
在這裡插入圖片描述

三、詳解

1、Qt的半自動化的記憶體管理
(1)QObject及其派生類的物件,如果其parent非0,那麼其parent析構時會析構該物件。
(2)QWidget及其派生類的物件,可以設定 Qt::WA_DeleteOnClose 標誌位(當close時會析構該物件)。
(3)QAbstractAnimation派生類的物件,可以設定 QAbstractAnimation::DeleteWhenStopped。
(4)QRunnable::setAutoDelete()、MediaSource::setAutoDelete()。
(5)父子關係:父物件、子物件、父子關係。這是Qt中所特有的,與類的繼承關係無關,傳遞引數是與parent有關(基類、派生類,或父類、子類,這是對於派生體系來說的,與parent無關)。

具體詳細程式碼分析請看連結:https://blog.csdn.net/u013711616/article/details/52688581