2012-11-16 21 views
5

我看過Qt的圖形用戶界面類似下面的語法所有的地方:將被銷燬如果從QObject派生的類的構造函數拋出?

myDialog::myDialog(QWidget *parent, Qt::WFlags flags):QDialog(parent, flags) 
{ 
    QPushButton *button = new QPushButton("&Download", this); 
    QVBoxLayout *layout = new QVBoxLayout(this); 
    //something that can throw here 
    layout ->addWidget(button); 
    setLayout(layout); 
} 

我一直想知道這是否可以在出現異常的情況下泄露,因爲「這個」我給的父母按鈕和佈局未完全構建,因此它可能不會摧毀其子項。

我在MSVC2010 Qt4.8.3中試過了,它看起來像一旦完全創建基類QObject類(當然首先完成),可以將「this」傳遞給構造函數中的其他對象,他們將被正確銷燬。

我還沒有在Qt文檔中發現保證這一點的位置,但是有人可以指向我,所以我可以保證這在將來不會改變?

回答

2

我相信這是標準的C++來保證base constructor is executed prior to derived constructors,但我不能引用標準的章節和詩句。也就是說,有一個保證,QObject's destructor將永遠銷燬該QObject的任何孩子。

Qt約定是QObject的指針傳遞給QObject或QWidget構造函數將成爲新構造對象的父對象。因此,當您通過thisbutton的ctor時,button成爲myDialog的子女。由於當時myDialog的QObject部分已經被構建,我相信你可以安全地依賴這個功能。

編輯:我要補充一點,在上述例子中,雖然button開始作爲的myDialog孩子由於構造,當添加到layout併成爲myDialog盛大獨生子女它被重設父,這應該還是被其QObject析構函數刪除。

+0

如果myDialog的構造函數拋出,QObject的析構函數將不會被調用。原代碼會有泄漏。 –

+3

我不認爲這是正確的。基類的析構函數仍應該被調用。 http://stackoverflow.com/questions/3759270/will-the-destructor-of-the-base-class-called-if-an-object-throws-an-exception-in – Phlucious

+0

你是對的。感謝您指出。 –

相關問題