引用变量参数vs本地引用变量

时间:2018-02-19 22:25:28

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

通过引用传递函数与创建本地引用变量并将其设置为等于对象之间是否存在重大差异。

对于上下文,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()函数才能正常工作?我用指针做了相同的实验而不是参考,我得到了相同的结果。

1 个答案:

答案 0 :(得分:4)

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

改为使用:

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