生活的全部意義在於無窮地探索尚未知道的東西,在於不斷地增加更多的知識。——左拉
該函式是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/***.qml")));
view->show();
關閉view時:
view->close(); //該函式會偶爾導致整個程式退出!看後面分析。可以不用它,直接掉deletelater()
view->deletelater()
view = null;
呼叫deletelater()後,***.qml中定義的物件會被銷毀(析構函式被呼叫)。close函式僅僅是關閉頁面,並不會將記憶體釋放掉,如果不呼叫deletelater函式會導致記憶體占用不斷增加! 我在除錯過程中,快速點選新建和關閉,並沒有遇到deletelater函式呼叫不及時的問題。
上面呼叫的close函式是qquickview的基類qwindow的函式,幫助文件中的解釋:
view->deletelater()被呼叫之後需要將view這個指標置為null,否則就是野指標。
疑惑:如果按照上面的**所寫,會不會出現這種情況:當刪除事件加入迴圈佇列後,指標被賦值為0,接著刪除事件被處理,這時因為指標為0,所以堆物件刪除失敗,造成了記憶體洩露?---- 不是!
deletelater函式是qobject類的乙個成員函式,它發出乙個event給主迴圈,發出的事件中本身包含了需要被delete的物件的位址。
ref:
函式基礎 匿名函式,函式,箭頭函式,立即執行函式
doctype html html lang en head meta charset utf 8 meta name viewport content width device width,initial scale 1.0 title document title head body body ...
函式 常見函式
def fib n if n 1 return 1if n 2 return 1return fib n 1 fib n 2 def hannuo n,a,b,c n 表示有n個盤子 a 代表第乙個塔,開始的塔 b 代表第二個塔,過渡塔 c 代表第三個塔,目標塔 d.在 中n 2,這個分支可以不要,...
Lua 函式 函式
在lua中,函式是一種對語句和表示式進行抽象的主要機制。函式既可以完成某項特定的任務,也可以只做一些計算並返回結果。lua具有一項非常於總不同的特徵,允許函式返回多個結果 s,e string.find hello lua users lua print s,e 7 9 以lua編寫的函式同樣可以返...