可能重复的问题虚析构函数的与虚函数表的问题~
当这个类作为基类时,目的是为了提供释放子类自己的资源
这个类是基类的话,一般情况下都要把析构函数声明为虚的。防止派生类在构造时,或者其他地方申请了资源,在析构函数里释放资源。如果不是虚析构函数的话,有可能会调用不到派生类的析构函数,而使资源得不到释放。举例
class A{public:void show(){cout<<"A::show"<<endl;}~A() {cout<<"~A()n";}};
class B: public A{public:B() { ptr = new int[20];}void show(){cout<<"B::show"<<endl;}~B() {cout<<"~B()n"; delete []ptr;}private:int* ptr;};
int main(){A* p = new B;delete p; //没有调用到B的析构函数,内存泄漏return 0;}
作为一般规则,我们建议将类层次结构的基类(声明了一个或者多个虚拟函数)的析构函数声明为虚拟的。这样在用delete释放该资源的时候,析构函数会被正确调用。
在继承机制下的类的析构函数的行为如下:派生类的析构函数先被调用。完成之后,直接基类的析构函数被静态调用。
参考:要将多态基类的析构函数声明为虚函数(Effective C++ )
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(3)
当这个类作为基类时,目的是为了提供释放子类自己的资源
这个类是基类的话,一般情况下都要把析构函数声明为虚的。防止派生类在构造时,或者其他地方申请了资源,在析构函数里释放资源。如果不是虚析构函数的话,有可能会调用不到派生类的析构函数,而使资源得不到释放。举例
class A
{
public:
void show(){cout<<"A::show"<<endl;}
~A() {cout<<"~A()n";}
};
class B: public A
{
public:
B() { ptr = new int[20];}
void show(){cout<<"B::show"<<endl;}
~B() {cout<<"~B()n"; delete []ptr;}
private:
int* ptr;
};
int main()
{
A* p = new B;
delete p; //没有调用到B的析构函数,内存泄漏
return 0;
}
作为一般规则,我们建议将类层次结构的基类(声明了一个或者多个虚拟函数)的析构函数声明为虚拟的。这样在用delete释放该资源的时候,析构函数会被正确调用。
在继承机制下的类的析构函数的行为如下:派生类的析构函数先被调用。完成之后,直接基类的析构函数被静态调用。
参考:
要将多态基类的析构函数声明为虚函数(Effective C++ )