class Base {
};
class Derive :public Base {
virtual void f(){}
};
int main() {
Base *b = new Derive();
delete b;
return 0;
}
如上代码运行时报错,求问怎么解释?
class Base {
};
class Derive :public Base {
virtual void f(){}
};
int main() {
Base *b = new Derive();
delete b;
return 0;
}
如上代码运行时报错,求问怎么解释?
delete一个没有virtual destructor的基类指针,在C++里是一个未定义行为(Undefined Behavior,简称UB),什么都可能发生,取决于不同的编译器。
如果存在一个强大的编译器,应该直接编译时直接报错,强制要求你提供基类的虚析构函数。
不过C++是一个松散的由程序员自己负责一大堆注意事项的语言,大部分时候理解到哪些是规定要这么做的,如果不这么做就是未定义行为,那就不要那么做即可。
理论上来说,没有正确调用子类析构函数,至少存在资源泄露的问题,毕竟C++就是靠按正确的顺序调用构造和析构函数来保证资源的初始化和反初始化。