之前写了一个C++的程序,类似于是这样的框架:
#include<iostream>
using namespace std;
class BaseClass{
public:
virtual void output(){
cout<<"BaseClass"<<endl;
}
};
class DerivedClass:public BaseClass{
public:
virtual void output(){
cout<<"DerivedClass"<<endl;
}
};
int main(){
BaseClass *p=new DerivedClass();
p->output();
delete p;
return 0;
}
在编译过程中遇到了这样的一个警告:Warning: deleting object of polymorphic class type 'BaseClass' which has non-vitrual destructor might cause undefined behaviour。
简单来说,就是我新建了一个子类对象,用基类指针指向这个子类对象,对于基类对象进行delete操作的时候产生的这个警告。它的意思是BaseClas是一个多态类,但是它的析构函数不是虚函数,有可能程序会造成undefined behaviour。
那么什么是undefined behaviour?举个例子来说,如果我们的程序中,DerivedClass对象申请了内存空间,并且在DerivedClass的析构函数中释放内存空间,但是基类和子类的析构函数并不是虚函数,运行上面的程序,基类指针指向子类对象,基类指针进行delete操作销毁子类对象,调用析构函数,则只会调用基类的析构函数,子类对象申请的内存空间没有被释放,造成内存泄漏的undefined behaviour。如果将析构函数改为虚函数,则不会产生这样的警告,首先调用子类的析构函数,随后调用基类的析构函数: