2011-02-25 86 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包含一个悬挂指针