Effective C++条款7:为多态基类声明virtual析构函数

要点:

带多态性质的基类或者class中有virtual函数,就应该将析构函数声明为virtual,例如

class TimeKeeper
{
public:
       TimeKeeper();
       ~TimeKeeper();
};


class AtomicClck : public TimeKeeper //原子钟 
{ };
 
class WaterClck : public TimeKeeper  //水钟  
{ }; 

class WristClck : public TimeKeeper //腕表 
{ };

int main()
{ 
     TimeKeeper * ptk = getTimeKeeper() ; //工厂方法获取钟的对象 
     
     delete ptk ;  //由于父类中的析构函数声明为非virtual,所以只会执行父类的析构函数
                   //这样就会造成子类中特有成员内存泄露 
}

 

以上代码造成内存泄露 没有释放子类一部分所占的内存,解决方法就是 在父类的析构函数前民加virtual,如下:

class TimeKeeper
{
public:
       TimeKeeper();
       virtual ~TimeKeeper();
};

 


相关要点:class内存

(一)类内部的成员变量:

  • 普通的变量:是要占用内存的,但是要注意对齐原则(这点和struct类型很相似)。
  • static修饰的静态变量:不占用内容,原因是编译器将其放在全局变量区。
(二)类内部的成员函数:
  • 普通函数:不占用内存。
  • 虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的,和虚函数的个数是没有关系的。

 PS:就算class内什么都没有,也必须占用一个字节

 

 

posted on 2012-09-02 15:49  as_  阅读(316)  评论(0编辑  收藏  举报

导航