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

C++父类指针指向子类对象时子类析构函数未被调用的问题

问题原因

你遇到的问题是C++中基类未声明虚析构函数导致的典型问题,具体逻辑如下:

  • C++的动态绑定(多态)只对虚函数生效,当通过基类指针删除派生类对象时,只有基类的析构函数被声明为虚函数,编译器才会根据指针指向的实际对象类型(也就是你这里的B类对象),先调用派生类的析构函数,再自动调用基类的析构函数。
  • 你的代码中基类A的析构函数~A()没有添加virtual关键字,编译器执行delete a2时,只会参考指针的静态类型(即A*),仅调用A类的析构函数,不会调用派生类B的析构函数。这种情况如果B类中有申请堆内存等资源,会直接导致资源泄漏。
修复方案

仅需将基类A的析构函数声明为虚函数即可:

#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout << "A constructor" << endl;
    }
    // 给析构函数添加virtual关键字
    virtual ~A()
    {
        cout << "A destructor" << endl;
    }
};
class B : public A
{
public:
    B()
    {
        cout << "B constructor" << endl;
    }
    ~B()
    {
        cout << "B destructor" << endl;
    }
};
int main()
{
    A a1;
    A *a2 = new B();
    delete a2;
}

修改后运行输出符合预期:

A constructor
A constructor
B constructor
B destructor
A destructor
A destructor
开发规范提示
  • 如果某个类被设计为基类用于继承,必须将其析构函数声明为虚函数。
  • 如果类不需要被其他类继承,无需添加虚析构函数,避免额外的虚函数表指针内存开销和运行时寻址损耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:15:06