C++虚拟解构造器和内存泄漏

C++ virtual desctructor and memory leaks

本文关键字:内存 泄漏 构造器 虚拟 C++      更新时间:2023-10-16

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

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字节肯定丢失了内存。我不知道为什么会发生这种情况,因为我的析构函数什么都不做,也没有成员变量。有什么想法吗?

编辑:我在Ubuntu中用g++编译了64位

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

C++03 5.3.5)

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

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

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

比较示例中ClassA和ClassC的sizeof。。。

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