我有最奇怪的内存泄漏,我不知道为什么。 我有一个抽象类如下:
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答案 0 :(得分:5)
是的,未定义的行为可能导致内存泄漏,这就是删除virtual
析构函数时会发生的情况。
3)[...]在第一个替代(删除对象)中,如果是静态类型 操作数与其动态类型不同,静态类型应为 是操作数的动态类型和静态类型的基类 应该有一个虚拟析构函数或行为是未定义的。 [...]
答案 1 :(得分:1)
正如其他答案所述,确实是UB。
我相信那些丢失的32个字节是从ClassC隐藏指针到vtable。
在示例中比较ClassA和ClassC的sizeof ...
具有虚拟内容的类通常大于其成员的总和....