我们先看一段代码
#include <iostream>
using namespace std;
class Base {
public:
~Base(); //不是虚函数
};
Base::~Base() {
cout<< "Base destructor" << endl;
}
class Derived: public Base{
public:
Derived();
~Derived(); //不是虚函数
private:
int *p;
};
void fun(Base *b){
delete b; //只会调用Base对象的析构函数
}
int main(){
Base *a=new Derived();
fun(a);
return 0;
}
当执行主函数中第一条语句时,定义a为指向Derived类的动态内存,此时则会调用Derived类的构造函数,开辟内存空间。而在执行fun函数时,由于其参数为Base类指针,且基类析构函数并不是虚函数,则只会调用基类的析构函数。程序执行后结果如下。
函数执行完后,因Derived类的析构函数没有调用,空间没有被释放,造成内存泄漏。
为什么基类析构函数不是虚函数时,只能根据形参表的类型确定析构函数。是因为虚函数在编译时不确定执行哪一条函数体,而是在运行时确定。根据调用对象的指针是哪个类来确定调用哪个类的虚函数。