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条)

报告相同问题?

悬赏问题

  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?
  • ¥15 matlab(相关搜索:紧聚焦)
  • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
  • ¥15 Arduino无法同时连接多个hx711模块,如何解决?