gpt4 book ai didi

c++ - 指针对象在某处损坏

转载 作者:行者123 更新时间:2023-12-01 15:04:37 24 4
gpt4 key购买 nike

我有两个类(class),Curve 和 ChildCurve。 ChildCurve 继承自 Curve。

曲线具有以下私有(private)字段

vector<Point2*>* curvePoints;

和以下公共(public)方法
vector<Point2*>* getCurvePoints();

ChildCurve 有一个方法可以修改这个字段,如下所示。
vector<Point2*> *pts = this->getCurvePoints();
pts->clear();
Point2 q1 = Point2(1.0, 3.0);
Point2 q2 = Point2(2.0, 4.0);
pts->push_back(&q1);
pts->push_back(&q2);
cout << qvec->at(0)->getX() << ", " << qvec->at(0)->getY() << endl;

此时,将打印正确的值。

后来,从其他类中,我尝试检索存储在 vector 中的点。
vector<Point2*> *curvePoints = curve->getCurvePoints();
for(int i = 0; i < curvePoints->size(); i++){
Point2* p = curvePoints->at(i);
cout << p->getX() << ", " << p->getY() << endl;
}

但是所有点的垃圾坐标都接近0,比如
2.22507e-308, 6.91993e-310

我很确定除了我在这里描述的内容之外,没有任何东西触及那个 vector 。有什么问题?这些值可能在哪里被破坏?

最佳答案

这是罪魁祸首:

Point2 q1 = Point2(1.0, 3.0); 
Point2 q2 = Point2(2.0, 4.0);
pts->push_back(&q1);
pts->push_back(&q2);

您将指向函数本地对象的指针推送到在函数结束后仍然存在的 vector 中。当函数运行时,locals 是有效的,所以你可以打印出来。但是,一旦功能结束,本地人就会变得无效。试图以未定义的行为取消引用指向它们的指针。

您只需按 new Point2 即可解决此问题进入 vector ,如下所示:
pts->push_back(new Point2(1.0, 3.0)); 
pts->push_back(new Point2(2.0, 4.0));

当然,您也必须删除这些对象。

更好的方法是使用 Point2 的 vector 。 s,而不是 Point2* s。如果必须为多态行为使用指针,请使用 std::unique_ptr而不是原始指针来简化您的内存管理。

关于c++ - 指针对象在某处损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19814217/

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