【问题标题】:What is the scope of references in c++? [duplicate]c++中的引用范围是什么? [复制]
【发布时间】:2019-12-08 11:04:52
【问题描述】:
   class fu
{
public:
    int pub;
    fu() { pub = 1; }

    ~fu() {
        std::cout << pub << "end"<<std::endl;
    }
};
fu& fub() {
    fu a;
    fu& re = a;
    return a;
}
int main() {
    std::cout << ++fub().pub;
}

输出:1 结束 \n 2

我预计引用会出错,因为函数中的变量已终止。但是,调用了析构函数并且 main 函数起作用了。参考指向什么?

【问题讨论】:

标签: c++ class scope reference lifetime


【解决方案1】:

引用指向已删除的对象。这是一个悬空的参考。因此,程序具有未定义的行为。

在这种特殊情况下,输出看起来正确只是因为被删除对象占用的内存还没有被覆盖。

【讨论】:

    【解决方案2】:

    您正在返回对局部变量的引用。当函数返回并且您的引用悬空时,该变量就会消失。在返回指向已死对象的引用后,使用该引用会导致未定义的行为。

    fu& fub() {
        fu a;
        fu& re = a;
        return a;
        // a is dead now
    }
    

    您可以通过编译器警告轻松检测到它,例如-Wall 在 g++ 上。

    直播Godbolt

    【讨论】:

      猜你喜欢
      • 2018-09-15
      • 2018-07-23
      • 2013-01-05
      • 1970-01-01
      • 2011-04-21
      • 2013-06-28
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      相关资源
      最近更新 更多