内存泄露之-虚析构函数

 
   
#include class Father { public: Father() { printf("Father\n"); } ~Father() //这样会导致内存泄漏,解决方法:virtual ~Father(){...} { printf("~Father\n"); } public: virtual void Print() { printf("PrintFather\n"); } }; class Child : public Father { public: Child(); ~Child() { printf("~Child\n"); } public: virtual void Print() { printf("PrintChild\n"); } int *m_iLeak; }; Child::Child() { m_iLeak = new int[10]; } void main() { Father *f = new Child(); //多态,通多父类指针指向子类函数; f->Print();              //调用子类的函数;
delete f;                //析构父类对象,此处存在问题,(子类对象在析构的时候,会先析构自身,然后析构父类对象,但是当单独析构父类对象的
f = NULL;                //时候,并不会调用子类的析构函数,导致在子类中申请的堆内存泄漏) int a = 0; }
解决方法,将父类的析构函数声明为虚函数
1、虚函数的限制:

         a).    Virtual不能修饰普通函数(全局函数),只能修饰成员函数
         b) .   不能修饰静态的成员函数
         c) .   不能修饰内联函数(若修饰内联函数,计算机将自动去掉内联,使得该函数成为普通的成员函数)
         d).  不能修饰构造函数(构造函数是用来创建对象的,而虚函数是建立在对象的基础上的,在构造函数执行时,对象尚未形成,所以不能修饰为虚函数)

你可能感兴趣的:(内存泄露之-虚析构函数)