我正在尝试学习更多关于多态的知识,我试图让它变得尽可能简单,所以我得到了基类图和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 = ˆ
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)
答案 0 :(得分:7)
程序行为未定义。
您只能 在delete
返回的指针上调用new
。
目前,您正在尝试delete
自动存储时间的内容。这永远不会结束。
答案 1 :(得分:3)
您实际上在Figure
创建了一个简单的Figure *ptr = new Figure();
,但是,您可以通过重新使用ptr
中的ptr = &rec;
来立即泄露它p>
在调用delete
之前,您再次使用ptr = ˆ
中的指针,实际上您正在调用:
delete ˆ
这显然是一个错误。
事实上,如果你从未在ptr
或new
中使用delete
但是使用不同的指针,那么一切都会正确无误:
Figure *ptr, *ptr2 = new Figure();
...
delete ptr2;