梁 兄

QQ: 160216918 QQ群: 26678700

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  53 Posts :: 5 Stories :: 361 Comments :: 0 Trackbacks
6. 基类的析构函数声明为虚函数,以防内存泄漏:
       在UAB系统里曾经发现内存泄漏, 这里不贴实际代码,举个类似的例子:
  class clsBaseOperate {
    public:
     clsBaseOperate(); // 可能都不写,使用默认
     ~clsBaseOperate();// 可能都不写,使用默认
     virtual void test( void ) = 0;
  };
  
  class clsAOperate : public clsBaseOperate {
    public:
     clsAOperate();
     ~clsAOperate();
     virtual void test( void );
     
    private:
     int ciType;
  };
  
  clsBaseOperate * lpoTest = new clsAOperate();
  ........
  delete lpoTest;
  
        分析:这里new/delete都是对应调用了,好象没有什么内存泄漏的可能.
 我们用purify工具一查看,就发现内存泄漏了,原因就是基类clsBaseOperate
 的析构函数引起的,没有声明为虚函数,以致delete lpoTest;只释放了基类
 部分的对象所占内存,派生类的部分没有得到调用,vtbl表里没有关于析构函数
 的信息啊。
        所以我们应该写: virtual ~clsBaseOperate(); 如果没有具体实现代码,
 就直接virtual ~clsBaseOperate() {}
 
         对99%的c++程序员来说,当他阅读着<<Effective C++>>和<<More effective C++>>
 两本书时,你问他这个引起内存泄漏的问题,他肯定100%的回答正确;而一旦在实际
 的开发编码过程中,当他再次碰到这个实际的问题时,就没有99%的c++程序员能象他
 回答考试时那么正确地写出无错的代码了。
         很多知识、很多规则、很多经验,并不仅仅我们看书看懂了,我们就真的掌握了。
 我们需要把这些东西融入习惯,在一些常规的代码编写中,要能无意识中就能写出
 好的代码来,就象一个真正的军人,他脱下军装穿上便服,随便走在哪里,他的步伐、
 他的双手的摆动、他的腰板的挺直,依然是与众不同,那么矫健!
        播下一个行动,收获一种习惯;
        播下一种习惯,收获一种性格;
        播下一种性格,收获一种命运。
posted on 2008-03-07 09:34 梁-兄 阅读(1230) 评论(4)  编辑 收藏 引用 所属分类: C/C++项目管理

Feedback

# re: 评审公司去年项目代码发现的一些问题之三 2008-03-07 12:58 魔域私服
http://www.zhaomysf.com.cn  回复  更多评论
  

# re: 评审公司去年项目代码发现的一些问题之三[未登录] 2008-03-08 11:41 杨粼波
如果确信是要继承的,
我是要虚掉析构函数的,
其实只要析构函数就虚掉是个好习惯,
通常析构函数本来也不是经常调用的,
是无须从效率上考虑.  回复  更多评论
  

# re: 评审公司去年项目代码发现的一些问题之三 2008-03-12 15:59 m
想起delphiVCL框架,类的析构函数本身就是虚函数,,由于又是单根继承,几乎不用考虑这个问题。
或许C++在实际开发中,应用某种框架也会降低错误,而不是依靠程序员的自发自觉。  回复  更多评论
  

# re: 评审公司去年项目代码发现的一些问题之三[未登录] 2008-03-18 01:25 hengshan
楼主写的很好
  回复  更多评论