动态多态中存在的问题:可能会产生内存泄漏!

以下通过一个例子向大家说明问什么会产生内存泄漏:

 

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.构造函数不能为虚函数。

 

 

 

 

 

 

 


 

posted on 2018-07-25 16:27  #鹿先森  阅读(565)  评论(0编辑  收藏  举报