注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

mie

 
 
 

日志

 
 

C++:关于析构函数和虚析构函数的一个误区  

2014-12-16 16:44:46|  分类: 疑难杂症 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
        这里主要是纠正网上普遍存在的一个认识误区。
        昨天遇到一个人,被问及一个问题:什么时候需要使用虚析构?什么情况下尽量不使用虚析构?
        我的回答是:使用基类指针delete对象的时候需要使用虚析构,其他情况下尽量别使用虚析构(会产生虚函数表 占用内存和影响性能)。但是对方表示不太合理,认为只要是有继承的尽量使用虚析构,否则基类析构不会被调用。
         我的印象中,正常情况下,基类析构是肯定被调用的。但是被这么一说,我犹豫了:难道自己记错了?
         于是网上搜索,结果是很多人都这么认为,认为非虚析构情况下,基类的析构函数不会被调用。为此作如下测试:

class A
{
public:
A()
{
printf("A() ++\r\n");
}
~A()
{
printf("A() --\r\n");
}
};


class B:
public A
{
public:
B()
{
printf("B() ++\r\n");
}
~B()
{
printf("B() --\r\n");
}
};

测试调用:
B b;

结果显示,基类析构被调用了!
        其实这在C++的教程中都有提到,测试之后 确认自己的记忆是正确的,平时工作中,很少会注意这些细节的问题,只不过大家工作久了,很多人都记混了。这里纠正一下,希望更多的人不再被错误的理解所干扰。

        虚析构函数主要用于使用基类指针回收子类的情况。例如:
B * pb=new B();
A * pa=pb;
delete pa;
这种情况下,如~A不是虚函数,将导致~B不被调用。

        个人观点:从性能的角度考虑,尽量不用虚析构函数,因为大部分情况下是没有必要的。当然,从另外一个角度看:为了防止一些误写,或者是新手犯错的情况,可以建议尽量使用虚析构。

纯虚析构:网上有人提及纯虚析构,个人觉得吧,挺能折腾的。。这个是编译无法通过的,除非编译器很挫。

By:zhanyonhu
  评论这张
 
阅读(622)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016