Qt deletelater函數分析(1)


                      生活的全部意義在於無窮地探索尚未知道的東西,在於不斷地增加更多的知識。——左拉


該函數是QObject類的函數:                             --------------------------       (了解該類可以幫助深刻理解即Qt)

deletelater的原理是 QObject::deleteLater()並沒有將對象立即銷毀,而是向主消息循環發送了一個event,下一次主消息循環收到這個event之后才會銷毀對象。

所有繼承自QObejet類的類都會維護一個自己的子對象列表,同時會存儲自己的父對象,所以界面中的各個控件(各個控價的基類都是QObject)可以實現層次!


“當我們使用父對象來創建一個對象的時候 ,父對象會把這個對象添加到自己的子對象列表中。當這個父對象被刪除的時候,它會遍歷它的子對象類表並且刪除每一個子對象,然后子對象們自己再刪除它們自己的子對象,這樣遞歸調用直到所有對象都被刪除。 這種父子對象機制會在很大程度上簡化我們的內存管理工作,減少內存泄露的風險。所以,使用deleteLater主要作用還是減少內存泄露的風險。”

關閉一個窗口時(QQuickView, QQuickWindow,注意QQuickView的基類是QQuickWindow),建議用這個方法的deleteLater()


項目中的實例:

QQuickView* view = new QQuickView();

view->setSource(QUrl(QStringLiteral("qrc:/QML/xxx.qml")));

view->show();

關閉view時:

view->close(); //該函數會偶爾導致整個程序退出!看后面分析。可以不用它,直接掉deletelater()

view->deleteLater()

view = NULL;

調用deleteLater()后,xxx.qml中定義的對象會被銷毀(析構函數被調用)。close函數僅僅是關閉頁面,並不會將內存釋放掉,如果不調用deleteLater函數會導致內存占用不斷增加! 我在調試過程中,快速點擊新建和關閉,並沒有遇到deleteLater函數調用不及時的問題。

 

上面調用的close函數是QquickView的基類QWindow的函數,幫助文檔中的解釋:

“potentially quitting the application!!!!!!!!!!”---所以還是別用了


# 注意:

view->deleteLater()被調用之后需要將view這個指針置為NULL,否則就是野指針。

疑惑:如果按照上面的代碼所寫,會不會出現這種情況:當刪除事件加入循環隊列后,指針被賦值為0,接着刪除事件被處理,這時因為指針為0,所以堆對象刪除失敗,造成了內存泄露?---- 不是! 

deleteLater函數是QObject類的一個成員函數,它發出一個event給主循環,發出的事件中本身包含了需要被delete的對象的地址。

Ref:

https://www.cnblogs.com/liushui-sky/p/5852090.html https://blog.csdn.net/qq_30126571/article/details/78036576 https://blog.csdn.net/ZXHL_hxf/article/details/83410852 https://blog.csdn.net/li235456789/article/details/50599757 https://bbs.csdn.net/topics/392388844 https://blog.csdn.net/dbzhang800/article/details/6300025


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM