C++:寻找"returning address of local variable..."的更正

C++: Looking for correction for "returning address of local variable..."

本文关键字:variable local address 寻找 returning C++ of      更新时间:2023-10-16

我目前正在参加在线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;
}
相关文章: