2016-05-16 71 views
1

現在我們必須創建class X(作爲基類)和class Y(如派生的)。它們都使用整數指針來保存不同大小的分配。虛擬解構器 - 內存泄漏

class X 
{ 
    int *p; 
    public: 
     X() {p=new int[2];} 
     ~X() {delete[] p;} 
}; 

class Y : public X { 
    int *q; 
    public: 
     Y() {q=new int[4];} 
     ~Y() {delete[] q;} 
}; 

而且,我們嘗試在一個簡單的循環:

for(int i=0;i<8;i++){X *ptr =new Y; delete ptr;} 

是什麼原因導致內存泄漏那裏,我們能做些什麼來解決這個問題?

+2

我相信術語 「析構函數」 是常用的,而不是 「解構」 – Slava

+1

[**這個問題**](HTTPS:/ /stackoverflow.com/questions/461203/when-to-use-virtual-destructors)是何時/何處使用虛擬破壞者的近庫,這個問題的案例就是其中之一。 – WhozCraig

+0

此代碼具有比內存泄漏更大的問題。 –

回答

1

每次執行該環路

for(int i=0;i<8;i++){X *ptr =new Y; delete ptr;} 

程序首先創建大小2 整數指針(2 * 4 = 8個字節分配)和後者產生具有大小整數指針4 (4- * 4 =分配了16個字節)但只刪除第一個。因此,對於每一個循環中,泄漏的16個字節,僅僅因爲你在派生類Y.

這就是所謂的基類缺乏所引起的虛擬解構的內存泄漏無法到達的解構。當您在類X virtual中創建解構器時,編譯器將能夠刪除Y型指針。所以,你必須要改變這種說法

~X() {delete[] p;} 

到這一點:

virtual ~X() {delete[] p;}