在QT的程序中常常會看到只有new而不delete的狀況,實際上是由於QT有一套回收內存的機制,主要的規則以下:html
1.全部繼承自QOBJECT類的類,若是在new的時候指定了父親,那麼它的清理時在父親被delete的時候delete的,因此若是一個程序中,全部的QOBJECT類都指定了父親,那麼他們是會一級級的在最上面的父親清理時被清理,而不用本身清理;編程
2.程序一般最上層會有一個根的QOBJECT,就是放在setCentralWidget()中的那個QOBJECT,這個QOBJECT在 new的時候沒必要指定它的父親,由於這個語句將設定它的父親爲總的QAPPLICATION,當整個QAPPLICATION沒有時它就自動清理,因此也 無需清理。9這裏QT4和QT3有不一樣,QT3中用的是setmainwidget函數,可是這個函數不做爲裏面QOBJECT的父親,因此QT3中這個 頂層的QOBJECT要自行銷燬)。函數
3.這是有人可能會問那若是我自行delete掉這些QT接管負責銷燬的指針了會出現什麼狀況呢,若是時這樣的話,正常狀況下QT的擁有這個對象的 那個父親會知道這件事情,它會直到它的兒子被你直接DELETE了,這樣它會將這個兒子移出它的列表,而且從新構建顯示內容,可是直接這樣作時有風險的! 也就是要說的下一條工具
4.當一個QOBJECT正在接受事件隊列時若是中途被你DELETE掉了,就是出現問題了,因此QT中建議你們不要直接DELETE掉一個 QOBJECT,若是必定要這樣作,要使用QOBJECT的deleteLater()函數,它會讓全部事件都發送完一切處理好後立刻清除這片內存,並且 就算調用屢次的deletelater也不會有問題。ui
5.QT不建議在一個QOBJECT 的父親的範圍以外持有對這個QOBJECT的指針,由於若是這樣外面的指針極可能不會察覺這個QOBJECT被釋放,會出現錯誤,若是必定要這樣,就要記 住你在哪這樣作了,而後抓住那個被你違規使用的QOBJECT的destroyed()信號,當它沒有時趕快置零你的外部指針。固然我認爲這樣作是及其麻 煩也不符合高效率編程規範的,因此若是要這樣在外部持有QOBJECT的指針,建議使用引用或者用智能指針,如QT就提供了智能指針針對這些狀況,見最後 一條。.net
6.QT中的智能指針封裝爲QPointer類,全部QOBJECT的子類均可以用這個智能指針來包裝,不少用法與普通指針同樣,能夠詳見QT assistantunix
經過調查這個QT的內存管理功能,發現了不少東西,如今以爲雖然這個QT弄的有點小複雜,可是使用起來仍是很方便的,最後要說的是某些內存泄露的檢測工具會認爲QT的程序由於這種方式存在內存泄露,發現時大可沒必要理會~ ~指針
來源: http://blog.chinaunix.net/uid-7769108-id-166789.htmlhtm