生活的全部意義在於無窮地探索尚未知道的東西,在於不斷地增加更多的知識。——左拉
該函數是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