C ++销毁基类导致调试断言失败

时间:2017-11-10 11:00:28

标签: c++ polymorphism virtual

我正在尝试学习更多关于多态的知识,我试图让它变得尽可能简单,所以我得到了基类图和2个派生类Rectangle和Circle。

class Figure {
public:
    Figure() { cout << "Creating Figure\n"; }
    virtual ~Figure() { cout << "Destroying Figure\n"; }

    virtual double calculateField() {
            return 0;
    }
};

class Rectangle : public Figure
{
public:
    Rectangle(double m_a) : p_a(m_a) { cout << "Creating Rectangle\n"; }
    ~Rectangle() { cout << "Destroying Rectangle\n"; }

    virtual double calculateField() {
        return p_a*p_a;
    }

private:
    double p_a; 
};

class Circle : public Figure
{
public:
    Circle(double m_r) : p_r(m_r) { cout << "Creating Circle\n"; }
    ~Circle() { cout << "Destroying Circle\n"; }

    virtual double calculateField() {
        return p_r*3.14*3.14;
    }

private:
    double p_r; 
};

在main函数中,我创建了指向Figure类和2个对象的指针 - 矩形和圆形。然后我在其中一个上设置了Figure指针,并在该指针上调用calculateField()。有用。但最后我尝试在这个指针上调用delete,它崩溃了我的程序。

int main(){
    Figure *ptr = new Figure();
    Rectangle rec(5);
    Circle circ(5);

    cout << "Figure field: " << ptr->calculateField() << endl;

    ptr = &rec; 
    cout << "Rectangle field: " << ptr->calculateField() << endl;

    ptr = &circ;
    cout << "Circle field: " << ptr->calculateField() << endl;

    delete ptr;

    cin.get();
    return 0;
}

结果如下:

  

创建图
创建图
创建矩形
  创建图
创建圆形图形字段:0
矩形   栏:25
圈场:49.298
销毁圈
  销毁图

     

但后来我得到了Debug Assertion Failed

     

表达式:_BLOCK_TYPE_IS_VALID(pHead - &gt; nBlockUse)

2 个答案:

答案 0 :(得分:7)

程序行为未定义。

您只能 delete返回的指针上调用new

目前,您正在尝试delete 自动存储时间的内容。这永远不会结束。

答案 1 :(得分:3)

您实际上在Figure创建了一个简单的Figure *ptr = new Figure();但是,您可以通过重新使用ptr中的ptr = &rec;来立即泄露它p>

在调用delete之前,您再次使用ptr = &circ;中的指针,实际上您正在调用:

delete &circ;

这显然是一个错误。

事实上,如果你从未在ptrnew中使用delete但是使用不同的指针,那么一切都会正确无误:

Figure *ptr, *ptr2 = new Figure();
...
delete ptr2;