返回参考后,数据将被删除

时间:2012-11-23 14:10:33

标签: c++ vector reference stdvector

我知道通过引用返回这让我感到困惑。

我有一个函数,它返回对类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)
{
//...
}

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

node在堆栈上创建(函数本地),因此在函数末尾删除。由于您返回的引用是node字段,因此也会将其删除。因此,您将返回对已删除对象的引用。

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