【发布时间】: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