代码之家  ›  专栏  ›  技术社区  ›  Enryu

参考变量参数vs局部参考变量[关闭]

  •  -2
  • Enryu  · 技术社区  · 6 年前

    通过引用将对象传递给函数与创建局部引用变量并将其设置为对象是否有主要区别。

    对于上下文,请说明。clone()将std::unique\u ptr返回给Otherlogamestate对象。makeMove()不是一个const函数,这可能是在const对象上调用它时导致分段错误的原因。

    出于某种原因,当我创建一个局部引用变量,将其设置为克隆的Otherlogamestate,并调用makeMove()时,我遇到了一个分段错误。正如我前面所述,我认为这是因为从状态返回的对象。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 回复  |  直到 6 年前
        1
  •  4
  •   Jarod42    6 年前

    这个 unique_ptr 创建人 state.clone() 于销毁 表达式结尾 . 所以您的引用/指针悬空。

    改用:

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