动态多态中存在的问题:可能会产生内存泄漏!
以下通过一个例子向大家说明问什么会产生内存泄漏:
1 class Shape//形状类 2 { 3 public: 4 Shape(); 5 virtual double calcArea(); 6 };
class circle:public Shape//圆类 { public: circle(int x,int y,double r);//构造函数 ~circle(); virtual double calcArea(); private: double m_dR; Coordinate *m_pCenter;//圆心坐标 };
circle::circle(int x,int y,double r) { m_pCenter=new Coordinate(x,y); m_dR=r; } circle::~circle() { delete m_pCenter; m_pCenter=NULL; }
int main(void) { Shape *shape1=new circle(4.0); shape1->calcArea(); delete shape1; shape1=NULL; return 0; }
delete shape1;
shape1=NULL;
当delete后面跟的是父类的指针,只会执行父类的析构函数,
当delete后面跟的是子类的指针,则父类和子类的析构函数都会被执行。
delete shape1;这个时候是想通过父类指针销毁子类对象,将不会执行子类的析构函数,所以会产生内存泄漏。
这种情况怎么解决呢?
我们使用virtual关键字来修饰析构函数。
写法:
这个时候我们再delete父类指针,首先就会执行父类指针指向的子类对象相应的析构函数。
析构函数的使用限制:
1.普通函数不能是析构函数。
2.静态成员函数不能是虚函数。
3.内联函数不能是虚函数。
4.构造函数不能为虚函数。