C ++虚拟析构函数和内存泄漏

时间:2012-09-09 15:10:22

标签: c++ memory-leaks polymorphism destructor valgrind

我有最奇怪的内存泄漏,我不知道为什么。 我有一个抽象类如下:

class ClassA
{
public:
    virtual ~ ClassA (){}
    virtual void notify(ClassB*) = 0;
    virtual void add(ClassB*) = 0;
}; 

class ClassC : public ClassA
{
public:
    void notify(ClassB*)
    { 
        //some cout statements
    }
    void add(ClassB*)
    { 
        //some cout statements
    }
};

int main()
{
    ClassA *f = new ClassC();
    delete f;
}

现在,当我编译代码并运行Valgrind时,它没有泄漏。但是,当我删除ClassA析构函数(或使其成为非虚拟)时,Valgrind将32字节报告为绝对丢失的内存。我不知道为什么会发生这种情况,因为我的析构函数什么也没做,而且没有成员变量。有什么想法吗?

编辑:我用U ++编译了Ubuntu 64bit

2 个答案:

答案 0 :(得分:5)

是的,未定义的行为可能导致内存泄漏,这就是删除virtual析构函数时会发生的情况。

C ++ 03 5.3.5)

  

3)[...]在第一个替代(删除对象)中,如果是静态类型   操作数与其动态类型不同,静态类型应为   是操作数的动态类型和静态类型的基类   应该有一个虚拟析构函数或行为是未定义的。 [...]

答案 1 :(得分:1)

正如其他答案所述,确实是UB。

我相信那些丢失的32个字节是从ClassC隐藏指针到vtable。

在示例中比较ClassA和ClassC的sizeof ...

具有虚拟内容的类通常大于其成员的总和....

相关问题