8 Qt 之物件樹與所有權

2021-09-14 05:05:33 字數 861 閱讀 8166

所有視窗及視窗控制項都是從qwidget直接或間接派生出來的。當你建立乙個qobject物件時,可以通過建構函式的引數指定其父物件,此時父物件會把這個qobject物件會自動新增到其children()列表中。當父物件析構的時候,這個列表中的所有(子)物件也會被析構。當我們刪除某個子物件時,父物件會自動將其從父物件列表中刪除。而當我們刪除某個父物件時,也會自動將其children()列表中所有子物件乙個乙個刪除。qt 保證沒有qobject會被 delete 兩次。

如果qobject物件在棧上被建立,qt 保持同樣的行為,來看下下面的**片段:

作為父元件的 w和作為子元件的 b都是qobject的子類,因標準 c++要求,區域性物件的析構順序應該按照其建立

順序的相反過程,所以此時會先呼叫b的析構函式,將其從父物件w的children()列表中刪除,之後再呼叫w的析構函式,因為此時b已經不再w的children()列表中,所以不會再次析構b。

但是,如果我們使用下面的**,情況又有所不同:

從上面**可以看出,因標準 c++要求,區域性物件的析構順序應該按照其建立順序的相反過程,所以此時會先析構w及其children()列表中的子物件,所以此時b也被析構。然後,**繼續執行,因為 b也是乙個區域性變數,在超出作用域的時候當然也需要析構,但是,這時候已經是第二次呼叫 quit 的析構函式了,c++ 不允許呼叫兩次析構函式,因此,程式崩潰了。

Qt之物件樹與所有權

qobjects在乙個物件樹中組織他們自己。當建立乙個qobject時,如果使用了其他物件作為其父物件,那麼,它就會被新增到父物件的children 列表中。這樣一來,當父物件被銷毀時,這個qobject也會被銷毀。事實表明,這個機制非常適合於管理gui物件。例如 乙個qshortcut 鍵盤快捷鍵...

物件生命所有權與TaskPool的歸屬問題

當物件的指標傳入另乙個執行緒時,物件的生命週期管理就變得複雜了,物件不能隨意銷毀自己了,因為其它執行緒可能正在使用它。相當於物件變成全域性的變數了,對於全域性變數我們直觀的感覺就是加鎖,但是加鎖就當程式設計變得不優雅了,需要在這個物件使用的地方都加上鎖。最好的的辦法,應該是通過引用計數來處理了,bo...

QT中的物件樹與物件擁有權

qobjects以物件樹組織它們自己。當你建立乙個qobject以另乙個物件作為其父物件時,這個qobject被加入到其父物件的children 列表中,當父物件對被刪除時,其子物件也會被刪除。實踐表明這種組織方式非常適合gui物件的特點與需要。舉例來說,乙個qshortcut 鍵盤快捷鍵 是其相關...