2016-11-16 104 views
0

假設我有一個基類X只有一個虛擬函數。虛擬析構函數 - 有需要時

我將它擴展爲Y並覆蓋該函數。

我沒有X和Y.

這個說法遭到破壞時會發生什麼情況提供明確的析構函數。

Y y; 
X *x= &y; 
return; 
. 
. 
. 
X*x = new Y; 
delete x; 
return; 

這將導致內存泄漏..

+0

都不是?另外我不明白這兩個代碼片斷是如何與虛擬析構函數相關的?您至少需要顯示類定義。 – UnholySheep

+0

1)沒問題。 x只是一個指針,但是y被破壞並且從超類中釋放所有資源。 2)Y的資源迷失了,因爲只有X的析構函數在內存中的Y實例上調用 - >可能的內存泄漏(或更糟糕的情況)。 – Youka

+0

@UnholySheep類定義沒有什麼特別之處。我提到了這個聲明。第二個似乎導致內存泄漏 –

回答

0
Y y; 
X *x = &y; 
return; 

什麼也沒有發生在這裏。對象y在其範圍的末尾被完全銷燬。

X*x = new Y; 
delete x; 
return; 

這將導致內存泄漏如果你是幸運。行爲是不確定的,意味着任何不好的事情都可能發生。

無論何時該類打算成爲其他類的基類,都聲明一個虛擬析構函數通常是個好主意。

相關問題