gpt4 book ai didi

C++ 破坏基类导致调试断言失败

转载 作者:太空宇宙 更新时间:2023-11-04 14:47:23 24 4
gpt4 key购买 nike

我正在尝试更多地了解多态性,并试图使其尽可能简单,所以我得到了基类 Figure 和 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;
};

在主函数中,我创建了指向 Figure 类和 2 个对象的指针 - 矩形和圆形。然后我在其中 1 个上设置 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;
}

结果如下:

Creating Figure
Creating Figure
Creating Rectangle
Creating Figure
Creating Circle
Figure field: 0
Rectangle field: 25
Circle field: 49.298
Destroying Circle
Destroying Figure

But then I got Debug Assertion Failed

Expression: _BLOCK_TYPE_IS_VALID(pHead -> nBlockUse)

最佳答案

程序行为未定义。

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

目前您正在尝试删除具有自动存储期限的内容。这永远不会有好结果。

关于C++ 破坏基类导致调试断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47221272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com