虚析构函数

 

所谓虚析构函数就是用virtual关键字修饰的析构函数。比如:

Class   A

{

         public:

                   virtual ~A();

};

这样的就是虚析构函数。

那么就出现了一个问题,为什么要使用虚析构函数呢?请看下面这个例子:

class  A

{

         public:

                   A();

                 ~A();

};

 

A::A()

{

         cout<<”A()”<<endl;

}

 

A::~A()

{

         cout<<”~A()”<<endl;

}

 

class B : public A

{

         public:

                   B();

                   ~B();

};

 

B::B()

{

         cout<<”B()”<<endl;

}

 

B::~B()

{

         cout<<”~B()”<<endl;

}

 

int main()

{

         A *pa;

         B *pb;

 

         pb = new B;

         pa = pb;

         delete pa;

 

return 0;

}

发动你那上帝赐予的智商高达300的大脑思考一下,这段看似简单的程序的输出结果是什么。再去自己编程验证一下,看计算机的大脑和你的是否一样。

如果猜的不错的话(这显然是废话啊),是不是很多人猜想会输出:

A()

B()

~B()

~A()

那只有恭喜你又取得了进步,因为你猜错了!程序的实际输出结果是:

A()

B()

~A()

是不是很诡异啊?明明是调用了B的构造函数,却没有调用到B的析构函数。不会是编译器出问题了吧?告诉你一个真理,写编译器的哥们儿不是一般的高手,他们是很牛的一群人。至于牛到什么程度,反正不是你我在目前这个阶段能望其项背的,所以不用怀疑编译器。程序之所以输出这样的结果,是因为试图通过一个基类型的指针来删除派生类对象。释放这个指针所指向的内存区域时,只会调到基类A的析构函数,这就是语法规则。

这肯定不是我们想要的啊,因为通常情况下B的析构函数肯定不是这么简单(实际上这只析构函数是没有意义的,举例需要啊),里面通常是是释放构造函数申请的内存,调不到B的析构,就造成了内存泄露了。怎么解决这个问题呢?

这就到重点了(说了这么多才到重点,正是绕啊!汗~~~),利用虚析构就可以解决这个问题。在A的析构函数之前添加virtual关键字即可。自己验证一下,可以看到输出结果为:

A()

B()

~B()

~A()

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jiuzhouming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值