2011-02-25 88 views
1

我有下面的代碼,它總是有內存泄漏請幫幫我。繼承刪除內存

謝謝, Ankata


class ABCD 
{ 
public: 
    ABCD(void); 
    ~ABCD(void); 

    CString tem1; 
    CString tem2; 
}; 

class CDE : 
    public ABCD 
{ 
public: 
    CDE(void); 
    ~CDE(void); 
    CString tem; 
}; 

void main() 
{ 
     CList<ABCD*> m; 
     CDE *a = new CDE(); 

     a->tem1 = "AAA"; 
     a->tem2 ="BBB"; 
     a->tem ="CCC"; 

     m.AddTail(a); 

     ABCD *b = m.GetTail(); 
     delete b; 
} 
+0

'它總是有記憶'是什麼意思?此外,你還沒有顯示你的類的定義,只有聲明。 – birryree 2011-02-25 16:09:36

+1

我不明白「它總是有記憶」是什麼意思。請澄清這個問題。這段代碼有很多錯誤,但並不全是,所以很難提出具體的建議。 – 2011-02-25 16:11:15

+0

CDE(tem)中的CString沒有被釋放?您需要在ABCD和CDE類上使用虛擬析構函數。在GetTail()的最後兩行中,刪除將調用ABCD析構函數而不是CDE析構函數。使析構函數虛擬將解決這個問題。 – 2011-02-25 16:12:28

回答

7

所以通過鑄造指針以基類型,它不會調用派生一個因此不釋放存儲器的析構函數你的類ABCD析構函數不是虛擬在CDE中分配。

+0

我明白了,謝謝Eric Fortin – Ankata 2011-02-25 16:13:10

+1

馬克問題回答那麼; – 2011-02-25 16:13:54

+0

那麼,OP只能在15分鐘後接受答案。耐心一點 ;) – ereOn 2011-02-25 16:15:35

2

ABCD的析構函數需要爲virtual

1

你ABCD析構函數應該是虛擬的一個,如果你要使用的基類指針刪除類

0

有很多的問題,這個代碼,我們沒有定義,很難知道具體的錯誤。

  1. 當使用繼承,除非你知道你在做什麼,使析構函數爲虛擬。在你的具體情況下,ABCD析構函數將被調用,而不是CDE,因爲它應該是

  2. 不要刪除b,除非你也將它從m中刪除。如果不是,m包含一個懸掛指針