2

我不知何故意识到通过引用返回这让我感到困惑。

我有一个函数,它返回对类的公共字段的引用BoardNodestd::vector<BoardNode> _neighboursVector.

我也有一堂课Board,里面有一个std::vector<BoardNode>.

我的成员函数是这样的:

const std::vector<BoardNode>& 
Board::getNeighboursVector(unsigned int x, unsigned int y) const
{
    BoardNode node = this->getBoardNode(x, y);
    //...
    node._neighboursVector.push_back(...);
    //...
    return node._neighboursVector;
}

在返回线上进行调试时,我在向量中得到了正确的值,但在这个函数之外,我得到了空向量。为什么 ?

std::vector<BoardNode> v = b.getNeighboursVector(5,5);

编辑

getBoardNode定义

const BoardNode & Board::getBoardNode(unsigned int rowIdx, unsigned int colIdx) const
{
//...
}

BoardNode & Board::getBoardNode(unsigned int rowIdx, unsigned int colIdx)
{
//...
}
4

2 回答 2

6

node是本地对象。并且通过扩展,node._neighborsVector也是一个本地对象。作为本地对象,它在函数结束时被销毁。因此,您正在返回对已破坏对象的引用。那是未定义的行为。

于 2012-11-23T14:14:36.543 回答
2

node在堆栈上创建(对您的函数来说是本地的),因此在函数结束时被删除。由于您返回的引用是它的一个字段,node因此也被删除。因此,您返回对已删除对象的引用。

您应该按值返回(在这种情况下正确实现复制构造函数 - 在这里可以)或按指针(由 new 创建,当您完成返回的对象时std::vector不要忘记)。delete

于 2012-11-23T14:14:48.390 回答