我的程序中有一个类,我曾经用它来绘制各种形状并将事件添加到形状中。
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);
请注意,在上面的代码中(在方法addRegularshape
中),我在将quad
添加到vector
集合之前,通过引用传递getMappedShape
。
在我的主程序中,我试图使用XQuad* returnedShape = getMappedShape(0)
方法检索形状,该方法将为我的目的返回指向四边形的指针。
quad
我检查了addRegularShape
方法中分配的getMappedShape
的内存地址和指针返回的地址(来自方法XQuad
),内存地址相同。
但是,从getMappedShape
返回时,addRegularShape
类中的数据不正确(即不是在其他三个成员函数中在XQuad引用对象中修改的数据)而是有一些垃圾值。我无法找到原因,为什么它发生了,并怀疑内存被损坏或其他什么,我将XQuad* quad = new XQuad();
中的引用对象更改为指针如下。
{{1}}
在此之后,该程序开始返回正确的值,但我仍然有点怀疑它为什么会发生?是不是添加XQuad对象的正确方法是将地址添加到集合中?或者是否存在一些范围问题,即当方法超出范围时,对象被销毁,我实际从集合返回的内容现在变成了垃圾值?
答案 0 :(得分:3)
_inputMappedShape[currentIndex++] = &quad;
表示您将quad的地址分配给_inputMappedShape。所以你将在你的完整程序中获得这个地址..但是在函数结束时addRegularShape(...)将会销毁与quad对象相关的数据,因为它的作用域将会结束..而_inputMappedShape将保留为quad的地址没有数据。
答案 1 :(得分:3)
您获得了垃圾值,因为我们将本地对象XQuad的地址传递给成员变量 _inputMappedShape [currentIndex ++] =&amp; quad 。
在创建局部变量时始终记住这一点,然后分配给该局部变量的内存始终在堆栈上。因此,一旦你离开函数,堆栈就会展开,现在你的 _inputMappedShape [currentIndex ++] 将指向一个实际上不存在的位置。
但是如果你使用 new 运算符在方法中创建一个变量,那么分配给它的内存将不再是堆栈上的堆栈。在这种情况下,当您从该函数返回时,堆栈展开将不会影响变量 _inputMappedShape [currentIndex ++] 。
答案 2 :(得分:2)
您正在返回本地对象的地址(在函数调用结束时将被销毁),因此您最终会得到未定义的行为。