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 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改