Loading

有关C++悬空引用的误区

问题

在C++中使用引用访问vector元素,结果与预期不符。

复现

简单还原代码如下

#include <iostream>
#include <vector>

class data
{
public:
    std::vector<int> Get() const
    {
        return vec;
    }
private:
    std::vector<int> vec = {1,2,3,4};
};

int main()
{
    data dat;
    auto const& a = dat.Get()[1];
    auto const& b = dat.Get()[2];
    std::cout << "a = " << a << ", b = " << b << std::endl;
    return 0;
}

运行结果

a = 0, b = 1433763856

思考

上述代码中Get()函数返回vector为临时拷贝, 且没有一个有效的引用确保其存活。
a赋值为临时vector中的元素不算做vector的有效引用,故临时vector在该行结束时被析构。
此时a,b变为悬空引用(dangling references),行为无法确定。

解决

修改方法包括但不限于:

  • data::Get()函数返回值类型改为vector<int>&
  • Get()返回值赋给一个变量x使其存活并调用x[1]
  • a,b声明为普通变量auto const产生deep copy

原文

Strange behavior of reference in c++ - Stack Overflow

posted @ 2021-12-27 23:53  azureology  阅读(389)  评论(0编辑  收藏  举报