删除继承中的内存

时间:2011-02-25 16:07:16

标签: c++

我有下面的代码,它总是有内存泄漏请帮帮我。

谢谢, 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;   
}

4 个答案:

答案 0 :(得分:7)

ABCD类的析构函数不是虚拟的,因此通过将指针转换为基类类型,它不会调用派生类的析构函数,因此不会释放CDE中分配的内存。

答案 1 :(得分:2)

ABCD的析构函数必须为virtual

答案 2 :(得分:1)

如果您要使用基类指针删除类,那么您的ABCD析构函数应该是虚拟的

答案 3 :(得分:0)

此代码存在很多问题,我们没有定义,因此很难知道具体错误。

  1. 使用继承时,除非您知道自己在做什么,否则请将析构函数设为虚拟。在您的特定情况下,将调用ABCD析构函数,而不是CDE析构函数

  2. 除非您也将其从m中删除,否则请勿删除b。如果没有,m包含一个悬空指针