2016-09-22 43 views
1

在以下示例中,b是一個多態指針類型,其靜態類型是Base*並且其動態類型是Derived*刪除一個沒有虛擬析構函數的多態對象會發生什麼?

struct Base 
{ 
    virtual void f(); 
}; 

struct Derived : Base 
{ 

}; 

int main() 
{ 
    Base *b = new Derived(); 
    // ... 
    delete b; 
} 

b在沒有虛擬析構函數的情況下被刪除會發生什麼?

+0

閱讀此內容以及https://www.securecoding.cert.org/confluence/display/cplusplus/OOP52-CPP.+Do+not+delete+a+polymorphic+object+without+a+virtual+destructor – v78

+0

[多態性中的基類缺少虛擬析構函數=資源泄漏?](http://stackoverflow.com/questions/33455750/virtual-destructor-missing-for-base-class-in-polymorphism-ressource-leak) – stefaanv

回答

2

當沒有虛擬析構函數的情況下刪除b時會發生什麼?

我們不知道。行爲是未定義的。對於大多數實際情況,可能不會調用Derived的析構函數,但沒有任何保證。

5.3.5 Delete [expr.delete]

(重點煤礦)

在第一種方式(刪除對象),如果該 對象的靜態類型要被刪除是從它的動態類型不同,靜態 類型應爲被刪除對象的動態類型的基類,並且靜態類型應具有虛擬析構函數或 行爲未定義

+2

@downvoter請告訴我我錯了,所以我可以改善它。 – songyuanyao

0

通過實際上這取決於從目標編譯器和在常見的情況

delete b; 

爲類型B,然後自由分配的內存descructor函數的調用。 因此,如果析構函數是虛擬的,然後從虛擬表(〜Derived)調用函數,但是如果沒有從類(〜Base)調用函數。 預期結果:〜只調用Base。

相關問題