要点:
带多态性质的基类或者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内什么都没有,也必须占用一个字节