2011-08-11 137 views
1

我有一個標準的QWidget派生類,但是在小部件銷燬後我得到了兩倍的空閒。每當我添加一個QTreeView指針作爲成員變量。QWidget刪除問題

例如爲:

private: 
    QTreeView *m_treeView; 

在類的構造函數,我做一個簡單:

m_treeView = new QTreeView(this); 

而QWidget的派生類的析構函數是默認的析構函數。

如果我放棄使用完全成員指針和做:

QTreeView *treeView = new QTreeView(this); 

一切都很好。有QLabel成員指針也工作正常。爲什麼我看到這種行爲?指針是否是類的成員應該與類的析構函數沒有關係,因爲對象是在堆上創建的,並且類不會刪除它們的成員變量所指向的對象,除非指示在自定義析構函數。

+0

事實證明,這是一個相當平凡的問題。我已經將這個類移動到第二個目錄,但由於某種原因,qmake沒有將使用QWidget派生類的MainWindow類標記爲需要重建。 將指針添加爲成員變量會改變類的大小,這會在刪除時導致內存損壞問題。由於我沒有改變類的構造函數的ABI,所以應用程序目標仍然被鏈接,但是QWidget派生類的大小變化是導致我所有問題的原因。 –

回答

0

每當你的QWidget的派生的對象被刪除,m_treeView也將因爲你通過this作爲父對象,當你構建m_treeView

這是因爲new QTreeView(this)最終將調用QObject(QObject * parent),這意味着你的成員變量被添加爲已刪除您的QWidget派生對象的子對象。

父對象的析構函數銷燬所有子對象。

the Qt docs

編輯: 對不起,錯過了

而QWidget的派生類的析構函數是默認的析構函數。

部分

+0

是的,但這並不能解釋_double_免費。非成員變量版本也包含「this」,所以人們會期待相同的行爲。但它最終成爲腐敗,而不是雙重自由。事實證明,由於文件移動導致內存損壞,qmake沒有檢測到它。我發佈了更多的細節,作爲對我原來的問題的評論。 –

+0

@Jonathan我以爲你可能自己刪掉了指針,但是我重讀了你的問題,並意識到你沒有 – dirk