从方法返回指针

Returning a pointer from a method

本文关键字:指针 返回 方法      更新时间:2023-10-16

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

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)

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

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

_inputMappedShape[currentIndex++] = &quad;

意味着你正在将 quad 的地址分配给_inputMappedShape.所以你会在你的完整程序中得到这个地址......但在函数结束时,addRegularShape(...( 与 quad 对象相关的数据将被销毁,因为它的范围将结束......并且_inputMappedShape将保留在没有数据的 quad 地址中。

您正在获取垃圾值,因为我们将本地对象 XQuad 的地址传递给成员变量 _inputMappedShape[currentIndex++] = &quad

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

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

您返回的是本地对象的地址(该地址将在函数调用结束时被销毁(,因此最终会得到未定义的行为。