C++:寻找"returning address of local variable..."的更正
C++: Looking for correction for "returning address of local variable..."
我目前正在参加在线C++课来填补失业期间的时间,我有一个关于返回局部变量地址的问题。我意识到这不是推荐的做法,我正在寻找我正在尝试做的事情的替代解决方案(返回数据以复制到我的对象"co"中,这是一个类 Coord 对象(。顺便说一句...该程序就结果而言有效。 但它确实收到警告 C4172"返回局部变量或临时变量的地址..."。 你能在这里帮我吗?
以下是详细信息: 在我的家庭作业程序中,我有一个返回局部变量 Coord co 地址的函数(Coord 是我构造的类,有两个 int 字段......明显地。。。坐标(。 我的目标是使用 Coord 复制构造函数使用该局部变量的地址复制数据。
调用程序声明类 Coord 的对象 co,如下所示
Coord co;
调用程序可以在几个地方调用函数requestMove((。 这是其中一个电话
co = bd.requestMove(pHuman);
requestMove(( 的签名是
const Coord& requestMove(Player&);
被调用的函数 requestMove(( 有一个本地 Coord 对象 nodeAddress,它填充 nodeAddress。返回语句为:
return nodeAddress;
欢迎提出意见和建议。 谢谢,非常感谢。
对象将在作用域退出后被销毁,因此它的内存是未分配的,并且有一个指向该内存的对象意味着它是未定义的行为。最佳解决方案是将 return 语句更改为return Coord{args...};
并将函数签名更改为Coord requestMove(Player&);
它将利用保证的副本省略,这意味着auto co = bd.requestMove(pHuman);
将导致auto co = Coord{args...};
您可以返回对临时持续时间对象的引用,但这只是向自己的脚开枪的方法之一。C++不是保姆语言,允许这样做。
考虑:
foo& bar() {
foo f;
return f;
}
此代码将编译,但会发生什么?起初你创建一个对象f
,但是当你从bar
返回时,对象f
超出范围并被破坏(这是RAII的本质(。返回的引用将是对不再存在的对象的"野生引用",并且尝试访问该内存位置只是未定义的行为(这是说程序将做什么的好方式 - 没有人知道。出于所有意图和目的,它可能会崩溃,它可以吃掉你的猫或煮你咖啡(。
编译器只是警告您,代码可能不会执行您期望它执行的操作。
更正是在此处按值返回对象。
foo bar() {
foo f;
return f;
}
- C++ Singleton - Prevent ::instance() to variable
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- "local scope"中的 C++ 初始化静态变量
- 如何通过多类"Union variable" (sfml) 使用轮询事件
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- C++:寻找"returning address of local variable..."的更正
- C++ - 在我尝试制作一个简单的计算器时有一个"uninitialized local variable y used"警告
- Visual Studio生成"Error: uninitialized local variable 'x' "而在线编译器不会 - 为什么?
- 虽然循环错误:"Uninitialized local variable used"
- "Uninitialized Local Variable Used"
- 错误:使用 char C++ "uninitialsed local variable 'name' used" *
- 避免"local variable as default parameter"的最佳设计?
- C++ " reference to local variable returned "
- 如何在发布模式下使'C4700: uninitialized local variable'成为错误
- 为什么编译器在返回对局部变量的局部引用时不警告"returning address of local variable or temporary"?
- 使用 C 字符串会发出警告:"Address of stack memory associated with local variable returned"
- 制作一个基本的 4 功能计算器,获得"error c4700: uninitialized local variable 'answ' used"
- Eclipse "assign to new local variable" (crtl+2-l) 不适用于 c++?
- 更改"uninitialized local variable"错误的行为
- 收到警告 C4189 "local variable is initialized but not referenced"即使正在引用变量