gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:02:29 24 4
gpt4 key购买 nike

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

最佳答案

您尝试执行的操作会调用未定义的行为,因此可以认为将析构函数声明为 virtual 是强制性的。

delete p

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

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

A a = B();

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

关于c++ - 使用指向基类的指针时的默认析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26394678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com