什么时候需要虚析构函数

什么时候需要虚析构函数     选择自 jackieyoung 的 Blog
关键字  什么时候需要虚析构函数
出处 
 答案:当你的类准备给别人继承时要提供虚析构函数
考虑下面例子:
class A
{
public:
 A(){cout << "In A constructor" << endl;}
 ~A(){cout << "In A destructor" << endl;}
};

class B : public A
{
public:
 B()
 {
 cout << "In B constructor" << endl;
 m_p = new char[10];
 }
 ~B()
 {
 cout << "In B destructor" << endl;
 if (m_p) delete [] m_p;
 }
private:
 char *m_p;
};

int main(int argc, char* argv[])
{
 //printf("Hello World!/n");
 A *p = new B;
 delete p;

 return 0;
}
输出结果:
In A constructor
In B constructor
In A destructor

并没有调用B的析构函数,new出来的内存没有及时回收造成内存泄漏。
要解决这个问题,只要将A的析构函数定义为虚函数:~A(){cout << "In A destructor" << endl;}。为什么定义为虚函数就能解决呢?我是这样理解的:
象其它虚构函数一样,~B()重定义(overridden)了~A(),这样指向派生类的指针就能根据运行时的状态调用B的析构函数了。这里又有一个问题:为什么还会调用A的析构函数呢?我只能理解为析构函数是一个特殊的函数,由系统维护其机制。就像B.~A()是错误而B.~B()(虽然逻辑上不对,但语法上是正确的,编译运行完全没问题)是正确的一样。

Any idea for this?

相关文章

对该文的评论
yjgx007 ( 2005-01-14)
quote: effective C++
c++语言标准关于这个问题的阐述非常清楚:当通过基类的指针去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的。
......
声明析构函数为虚就会带来你所希望的运行良好的行为:对象内存释放时,派生类enemytank和基类enemytarget的析构函数都会被调用。

======================================
对于定义基类的析构函数为虚函数, 我的理解是, 在从派生类类型至基类类型转换后,在析构过程中也能确保派生类和基类的析构函数均被调用!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值