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

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

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++就是靠按正确的顺序调用构造和析构函数来保证资源的初始化和反初始化。

    点赞 打赏 评论
  • 幻灰龙 2021-01-12 22:12

    C++基类指针被delete的时候。

    1. 如果b的析构函数不是虚函数,直接调用b的析构函数,释放b的内存。

    2. 如果b的析构函数是虚函数,先查找虚函数表,找到派生类的析构函数调用,再调用基类的构造函数,最后释放内存。

    所以你不定义Base的析构函数为虚析构函数的话,析构不完整。

    点赞 打赏 评论
  • cnmgbmsdn 2021-01-12 22:28

    析构不完整也只是有可能产生内存泄漏。上面代码导致的运行时异常是什么原因?

    点赞 打赏 评论

相关推荐 更多相似问题