【问题标题】:Reference variable parameter vs local reference variable [closed]参考变量参数与局部参考变量
【发布时间】:2018-02-19 22:25:28
【问题描述】:

通过引用传递对象与创建局部引用变量并将其设置为等于对象之间是否存在主要区别。

对于上下文,state.clone() 将 std::unique_ptr 返回到 OthelloGameState 对象。 makeMove() 不是 const 函数,这可能是在 const 对象上调用它时导致分段错误的原因。

由于某种原因,当我创建一个局部引用变量时,将它设置为等于克隆的 OthelloGameState,然后调用 makeMove() 我遇到了分段错误。就像我之前所说的那样,我认为这是因为从 state.clone() 返回的对象仍然是 const,当我在其上调用 makeMove() 时会导致崩溃。

virtual std::pair<int, int> chooseMove(const OthelloGameState& state)
{
    OthelloGameState& duplicateState = *state.clone();
    duplicateState.makeMove(2,3);

    return std::make_pair(0,0);
}

然而,令我困惑的是,我设法通过引用传递它通过一个函数然后在其上调用相同的 makeMove() 函数来解决这个问题。下面的代码完美运行,我没有遇到分段错误。

virtual std::pair<int, int> chooseMove(const OthelloGameState& state)
{
    moveMe(*state.clone());
    return std::make_pair(0,0);
}

void moveMe(OthelloGameState& state)
{
    state.makeMove(2,3);
}

在本地引用上调用 makeMove() 会导致分段错误是否有原因,而首先通过引用将其传递给函数然后调用相同的 makeMove() 函数会完全正常工作?我用指针而不是引用做了同样的实验,得到了同样的结果。

【问题讨论】:

  • 请不要发布代码图片。
  • *state.clone() 会发生内存泄漏(或者如果您使用智能指针,则会创建悬空指针)。
  • 如果您为像我这样的公司工作,该公司使用您的代码图像阻止 imgur,那么您的问题将无法阅读。
  • @NathanOliver 你并没有错过太多
  • 发布文本图片或链接到它们是完全不合理的。 (1) 比发文要辛苦得多; (2)浪费读者带宽; (3) 它可以防止在 cmets 和答案中使用剪切和粘贴。不要在这里做。

标签: c++ c++11 pointers reference pass-by-reference


【解决方案1】:

state.clone() 创建的unique_ptr表达式结束时被销毁。 所以你的参考/指针是悬空的。

改用:

auto cloned = state.clone();
cloned->makeMove(2, 3);

【讨论】:

  • 好吧,如果我错了,请纠正我,但我从您发布的内容中了解到,克隆是另一个 unique_ptr,它在从 state 返回的 unique_ptr 之前调用移动赋值运算符/复制构造函数.clone() 超出范围。这是交换内容,这意味着 state.clone() 中的 unique_ptr 在超出范围时未指向该对象。但是,我不明白为什么通过函数传递它是有效的。当参数不是 unique_ptr 时,函数如何调用 operator= 或复制构造函数。
  • @BrandonLavigne:在moveMe(*state.clone()); 中,unique_ptr 在表达式末尾被销毁,所以在;,所以在调用MoveMe 之后。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 2015-11-15
相关资源
最近更新 更多