参考变量参数 vs 本地参考变量
Reference variable parameter vs local reference variable
通过函数引用传递对象与创建局部引用变量并将其设置为对象之间是否存在主要区别。
对于上下文,state.clone() returns a std::unique_ptr 到 OthelloGameState 对象。 makeMove() 不是 const 函数,这可能是在 const 对象上调用它时导致分段错误的原因。
出于某种原因,当我创建一个局部引用变量,将其设置为等于克隆的 OthelloGameState,并调用 makeMove() 时,我遇到了分段错误。就像我之前所说的那样,我认为这是因为从 state.clone() 返回的对象仍然是常量,当我对其调用 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()
创建的 unique_ptr
在 表达式结尾 被销毁。
所以你的 reference/pointer 悬而未决。
改用:
auto cloned = state.clone();
cloned->makeMove(2, 3);
通过函数引用传递对象与创建局部引用变量并将其设置为对象之间是否存在主要区别。
对于上下文,state.clone() returns a std::unique_ptr 到 OthelloGameState 对象。 makeMove() 不是 const 函数,这可能是在 const 对象上调用它时导致分段错误的原因。
出于某种原因,当我创建一个局部引用变量,将其设置为等于克隆的 OthelloGameState,并调用 makeMove() 时,我遇到了分段错误。就像我之前所说的那样,我认为这是因为从 state.clone() 返回的对象仍然是常量,当我对其调用 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()
创建的 unique_ptr
在 表达式结尾 被销毁。
所以你的 reference/pointer 悬而未决。
改用:
auto cloned = state.clone();
cloned->makeMove(2, 3);