2012-09-20 42 views
6

根據Qt文檔:刪除時,QObject會區分堆棧和堆分配的子項嗎?

QObject將自己組織在對象樹中。當您創建一個 QObject與另一個對象作爲父對象時,該對象將自動將其自身添加到父級的children()列表中。父母取得對象的所有權 ;即它會自動刪除它的子對象在它的 析構函數中。

對於我來說,這意味着當一個QObject被刪除時,它會通過並調用刪除它存儲在其子列表中的所有指針。

但是,對於孩子來說,動態分配並不是必要的,並且使用堆棧分配對象來構建QObject樹是完全合法的。

根據標準規範,對不指向動態分配對象的指針調用delete是未定義行爲,這可能導致任何內容從「無」到程序崩潰。

IMO它不太可能QObject,它幾乎是Qt類的幾乎整個集合的骨幹依賴於可能產生未定義行爲的東西。

那麼,QObject在刪除時是否區分堆棧和堆分配的子項?如果是這樣,怎麼樣?

回答

9

但是,沒有必要爲孩子進行動態分配, ,這是完全合法建立的QObject樹木堆棧中分配 對象。

號見QObject::~QObject()

警告:所有子對象被刪除。如果這些對象中的任何一個都在 堆棧或全局中,那麼您的程序遲早會崩潰。

+2

是的,應該先看看析構函數,然後再問全部... 10x – dtech

+0

一些有趣的相關主題:在堆棧中分配根QObject;一切(兒童)堆上https://stackoverflow.com/questions/19331396/how-does-qt-delete-objects-and-what-is-the-best-way-to-store-qobjects?rq= 1 –