使用指向基类的指针时的默认析构函数

时间:2014-10-16 01:10:37

标签: c++ polymorphism default destructor

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的实例,还是会有任何内存泄漏?我知道我可以在这里使用虚拟析构函数,但我不确定默认情况如何。

1 个答案:

答案 0 :(得分:4)

您尝试执行的操作会调用未定义的行为,因此将析构函数声明为virtual可视为必需行为。

delete p

将尝试删除p作为A的实例,但由于析构函数未声明为虚拟,因此不会调用正确的运行时实现。

请注意,当你没有指针而只是一个具体的对象时,这不会发生,例如

A a = B();

因为对象切片之前发生过,所以当a退出范围时,它只是A