3

我的程序中有一个特定的类,我用来绘制各种形状并将事件添加到形状中。

vector<XQuad*> _inputMappedShape;
void addRegularShape(Container inputPoints, Container outputPoints){
XQuad quad;
setInputPoints(quad, somePoints);
setInputPoints(quad, somePoints);
setArrowHandles(quad, somePoints);
_inputMappedShape[currentIndex++] = &quad;
}

XQuad* getMappedShape(int index){
return _inputMappedShape[index];
}

void setInputPoints(XQuad& quad, Point* somePoints);
void setOutputPoints(XQuad& quad, Point* somePoint);
void setArrowHandles(XQuad& quad, Point* somePoint);

请注意,在上面的代码中(在 method 中addRegularshape),我在将quad其他方法添加到vector集合之前通过引用传递它。

在我的主程序中,我试图使用getMappedShape为我的目的返回指向四边形的指针的方法来检索形状。
XQuad* returnedShape = getMappedShape(0)

我检查了方法中quad分配的内存地址addRegularShape和指针(从方法getMappedShape)返回的地址,并且内存地址是相同的。
但是,不知何故,当我XQuad从 类中返回时,我的类中的数据getMappedShape是不正确的(即不是在其他三个成员函数中的 XQuad 引用对象中修改的数据),而是有一些垃圾值。我找不到发生这种情况的原因,并且怀疑内存已损坏或其他原因,我将addRegularShape指向指针中的引用对象更改如下。
XQuad* quad = new XQuad();

在此之后,程序开始返回正确的值,但我仍然有点怀疑它为什么会发生?添加 XQuad 对象不是将地址添加到集合的正确方法吗?或者这里是否存在一些范围问题,即当方法超出范围时,对象被销毁并且我从集合中实际返回的内容现在变成了垃圾值?

4

3 回答 3

3
_inputMappedShape[currentIndex++] = &quad;

表示您将四边形的地址分配给 _inputMappedShape。所以你会在你的完整程序中得到这个地址.. 但是在函数 addRegularShape(...) 的末尾,与四边形对象关联的数据将被销毁,因为它的范围将结束.. 并且 _inputMappedShape 将保留四边形的地址没有数据。

于 2013-06-21T05:53:39.023 回答
3

您得到垃圾值是因为我们将本地对象 XQuad 的地址传递给成员变量_inputMappedShape[currentIndex++] = &quad

当您创建一个局部变量时,请始终记住这一点,然后分配给该局部变量的内存始终在堆栈上。因此,一旦您退出该函数,堆栈就会展开,现在您的_inputMappedShape[currentIndex++]将指向某个实际上不存在的位置。

但是,如果您使用new运算符在方法内创建变量,则分配给它的内存将不再位于堆栈上,而是位于堆上。在这种情况下,从该函数返回时堆栈展开不会对变量_inputMappedShape[currentIndex++]产生影响。

于 2013-06-21T07:16:58.337 回答
2

您正在返回本地对象的地址(将在函数调用结束时销毁),因此您最终会出现未定义的行为。

于 2013-06-21T05:41:38.060 回答