You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基类含虚析构函数时,子类用默认析构的多态删除是否安全?

问题解答:通过基类指针删除无显式析构的派生类对象是否安全?

答案是完全安全,而且会严格按照正确的顺序执行析构函数——如果aptr指向的是C类对象,析构顺序会是:先调用C的默认析构函数,接着是B的默认析构,最后是A的虚析构函数。

核心原因:虚析构函数的继承特性

基类A的析构函数被声明为virtual,这是关键。根据C++标准,只要基类的析构函数是虚函数,那么所有派生类的析构函数(不管是显式定义的还是编译器自动生成的默认析构)都会自动成为虚函数。

对你的代码来说:

  • 编译器会为B、C、D自动生成默认析构函数,这些析构函数会继承A的虚属性。
  • 当执行delete aptr时,虚函数机制会根据aptr实际指向的对象类型(比如C),调用对应的析构函数。

析构顺序的细节

当C的默认析构函数被调用时:

  1. 首先执行C类自身的析构逻辑(虽然你没写,但编译器生成的默认析构会处理成员变量的销毁);
  2. 然后自动调用直接基类B的默认析构函数;
  3. B的析构函数执行完毕后,再调用基类A的虚析构函数。

整个过程完全符合C++中派生类对象销毁时“先派生、后基类”的析构顺序,不会出现内存泄漏或未定义行为。

补充说明

如果基类A没有将析构函数声明为virtual,那么通过A*指针删除派生类对象才是未定义行为——但你的代码里已经正确使用了虚析构,所以完全不用担心这个问题。

内容的提问来源于stack exchange,提问作者kdog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:41:55