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++程序员能象他
回答考试时那么正确地写出无错的代码了。
很多知识、很多规则、很多经验,并不仅仅我们看书看懂了,我们就真的掌握了。
我们需要把这些东西融入习惯,在一些常规的代码编写中,要能无意识中就能写出
好的代码来,就象一个真正的军人,他脱下军装穿上便服,随便走在哪里,他的步伐、
他的双手的摆动、他的腰板的挺直,依然是与众不同,那么矫健!
播下一个行动,收获一种习惯;
播下一种习惯,收获一种性格;
播下一种性格,收获一种命运。