Qt內存管理

在Qt的程序中經常會看到只有new而不delete的情況,其實是因爲Qt有一套回收內存的機制,主要的規則如下:

1.所有繼承自QObject類的類,如果在new的時候指定了父親,那麼它的清理時在父親被delete的時候delete的,所以如果一個程序中,所有的QObject類都指定了父親,那麼他們是會一級級的在最上面的父親清理時被清理,而不用自己清理;

2. 程序通常最上層會有一個根的QObject,就是放在setCentralWidget()中的那個QObject,這個QObject在 new的時候不必指定它的父親,因爲這個語句將設定它的父親爲總的QApplication,當整個QApplication沒有時它就自動清理,所以也 無需清理。這裏Qt4和Qt3有不同,Qt3中用的是setmainwidget函數,但是這個函數不作爲裏面QObject的父親,所以Qt3中這個頂 層的QObject要自行銷燬)。

3.這是有人可能會問那如果我自行delete掉這些Qt接管負責銷燬的指針了會出現什麼情況呢,如果 這麼做的話,正常情況下被delete的對象的父親會知道這件事情,它會知道它的兒子被你直接delete了,這樣它會將這個兒子移出它的列表,並且重新 構建顯示內容,但是直接這樣做是有風險的!也就是要說的下一條。

4.當一個QObject正在接受事件隊列時如果中途被你DELETE掉 了,就是出現問題了,所以Qt中建議大家不要直接DELETE掉一個QObject,如果一定要這樣做,要使用QObject的 deleteLater()函數,它會讓所有事件都發送完一切處理好後馬上清除這片內存,而且就算調用多次的deletelater也不會有問題。

5.Qt 不建議在一個QObject對象的父親的範圍之外持有對這個對象的指針,因爲如果這樣外面的指針很可能不會察覺這個QObject被釋放,會出現錯誤。如 果一定要這樣,就要記住你在哪這樣做了,然後抓住那個被你違規使用的QObject的destroyed()信號,當它沒有時趕快置零你的外部指針。當然 我認爲這樣做是及其麻煩也不符合高效率編程規範的,所以如果要這樣在外部持有QObject的指針,建議使用引用或者用智能指針,如Qt就提供了智能指針 針對這些情況,見最後一條。

6.Qt中的智能指針封裝爲QPointer類,所有QObject的子類都可以用這個智能指針來包裝,很多用法與普通指針一樣,可以詳見Qt assistant

通過調查這個Qt的內存管理功能,發現了很多東西,現在覺得雖然這個Qt弄的有點小複雜,但是使用起來還是很方便的,最後要說的是某些內存泄露的檢測工具會認爲Qt的程序因爲這種方式存在內存泄露,發現時大可不必理會~

原帖地址:http://blog.csdn.net/leonwei/archive/2009/01/04/3703598.aspx
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章