C++抽象类无虚析构函数时执行delete操作报错的原因是什么?
C++ delete操作报错成因
报错提示:
Delete called on'animal' that is abstract but has non-virtual destruct
你的报错由两个违反C++语法规则的操作共同导致:
- 基类缺少虚析构函数
作为抽象基类的Animal被用于多态场景:你用Animal类型的指针指向派生类Cat的实例,当执行delete animal时,由于Animal的析构函数是编译器默认生成的非虚函数,程序只会调用Animal的析构函数,不会调用派生类Cat的析构函数,导致派生类对象的资源清理不完全,属于未定义行为,运行时检测到该问题后触发对应报错。C++规范明确要求:用于多态场景的基类必须声明虚析构函数。 - 同一块内存二次释放
代码中的cat指针是由animal指针强制类型转换得到的,二者指向堆上的同一块内存区域。你先执行delete animal已经完成了该内存的释放,后续再执行delete cat属于对已经释放的内存做二次销毁,直接触发SIGABRT信号导致程序崩溃。
内容的提问来源于stack exchange,提问作者낑낑깡
相关产品推荐
相关产品推荐

