指针对象在某处被破坏

bro*_*rto 0 c++ pointers vector

我有两个班,Curve和ChildCurve.ChildCurve继承自Curve.

Curve具有以下私有字段

vector<Point2*>* curvePoints;
Run Code Online (Sandbox Code Playgroud)

以及以下公共方法

vector<Point2*>* getCurvePoints();
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

此时,将打印正确的值.

后来,从其他一些类中,我尝试检索存储在向量中的点.

vector<Point2*> *curvePoints = curve->getCurvePoints();
for(int i = 0; i < curvePoints->size(); i++){
    Point2* p = curvePoints->at(i);
    cout << p->getX() << ", " << p->getY() << endl;
}
Run Code Online (Sandbox Code Playgroud)

但所有的点都有垃圾坐标接近0,就像

2.22507e-308, 6.91993e-310
Run Code Online (Sandbox Code Playgroud)

除了我在这里描述的内容之外,我很确定没有任何东西可以触及那个向量.可能有什么不对?这些价值在哪里可能会被破坏?

das*_*ght 7

这是罪魁祸首:

Point2 q1 = Point2(1.0, 3.0); 
Point2 q2 = Point2(2.0, 4.0); 
pts->push_back(&q1); 
pts->push_back(&q2);
Run Code Online (Sandbox Code Playgroud)

将指向函数本地对象的指针推送到经过函数末尾的向量中.当函数运行时,本地有效,因此您可以打印它们.但是,一旦功能结束,本地人就会变得无效.尝试在未定义的行为中取消引用它们的指针.

您只需按下new Point2向量即可解决此问题,如下所示:

pts->push_back(new Point2(1.0, 3.0)); 
pts->push_back(new Point2(2.0, 4.0));
Run Code Online (Sandbox Code Playgroud)

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

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