cnmgbmsdn 2021-01-12 21:39 采纳率: 100%
浏览 7
已采纳

为什么回收无虚指针的基类指针指向有虚指针的衍生类对象时运行时会报错?

class Base {
	
};
class Derive :public Base {
	virtual void f(){}
};
int main() {
	Base *b = new Derive();
	delete b;
	return 0;
}

如上代码运行时报错,求问怎么解释?

  • 写回答

3条回答 默认 最新

  • 幻灰龙 2021-01-13 09:31
    关注

    delete一个没有virtual destructor的基类指针,在C++里是一个未定义行为(Undefined Behavior,简称UB),什么都可能发生,取决于不同的编译器。

    如果存在一个强大的编译器,应该直接编译时直接报错,强制要求你提供基类的虚析构函数。

    不过C++是一个松散的由程序员自己负责一大堆注意事项的语言,大部分时候理解到哪些是规定要这么做的,如果不这么做就是未定义行为,那就不要那么做即可。

    理论上来说,没有正确调用子类析构函数,至少存在资源泄露的问题,毕竟C++就是靠按正确的顺序调用构造和析构函数来保证资源的初始化和反初始化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥15 pyqt信号槽连接写法
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。