class A
{
int a;
};
class B : public A
{
int b;
};
int main(void)
{
A * p = new B;
delete p; // (1)
return 0;
}
在上面的代码中,两个类都有默认的编译器生成的析构函数。这两个类也只有普通旧数据作为成员,所以我不需要手动编写的d'tors,这将释放任何资源。所以我的问题是 - 在(1)
中调用之后,默认的析构函数会释放整个B
的实例,还是会有任何内存泄漏?我知道我可以在这里使用虚拟析构函数,但我不确定默认情况如何。
答案 0 :(得分:4)
您尝试执行的操作会调用未定义的行为,因此将析构函数声明为virtual
可视为必需行为。
delete p
将尝试删除p
作为A
的实例,但由于析构函数未声明为虚拟,因此不会调用正确的运行时实现。
请注意,当你没有指针而只是一个具体的对象时,这不会发生,例如
A a = B();
因为对象切片之前发生过,所以当a
退出范围时,它只是A