从方法返回指针
Returning a pointer from a method
我的程序中有一个特定的类,我用它来绘制各种形状并向形状添加事件。
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++] 没有影响。
您返回的是本地对象的地址(该地址将在函数调用结束时被销毁(,因此最终会得到未定义的行为。
- 在 const 函数中通过引用和指针返回之间的区别
- 指向 std::unrodered_map 中元素的指针返回'Read access violation'
- 为什么要为指针返回类型返回一系列字符?
- Visual C 运行时:Malloc将指针返回到已经使用的内存(包含实际字符串)
- 将原始指针返回到智能指针
- 从函数中的指针返回对象,例如链接列表
- 将指针返回使用New创建的数组数组
- 查找并将指针返回向量中的对象
- 函数可以将指针返回其自己的类型
- 指针返回值的地址
- 为什么静态指针返回函数中有一个"静态"键?
- 从弱指针返回类型返回共享指针
- 如何将C++引用和指针返回转换为 C++/CLR
- 从指针返回对象时出现意外的析构函数调用
- 阵列指针返回垃圾
- (C )当在同一类中调用时,污点指针返回正确的值,而从MAIN调用时为0
- C 从指针返回到成员功能
- 在构造函数以外的任何其他位置访问相机时,我的相机指针返回 null
- 从取消引用的指针返回原始指针
- 指针返回