什么是悬空参考?

时间:2017-09-02 07:26:26

标签: c++ reference undefined-behavior

以下程序给出了运行时错误(Segmentation Fault(SIGSEGV))。

#include <iostream>
using namespace std;

int& bar()
{
    int n = 10;
    return n;
}

int main() {
    int& i = bar();
    cout<<i<<endl;
    return 0;
}

我的老师告诉我这是一个未定义的行为,因为悬挂参考。他是对的吗? 如果是,那么如何避免呢?

1 个答案:

答案 0 :(得分:4)

是的,它确实是一个未定义的行为,因为你正在返回对自动变量的引用,当bar()的执行完成时将被销毁

你可以通过写:

来避免它
#include <iostream>
using namespace std;

int& bar()
{
    static int n = 10;
    return n;
}

int main() {
    int& i = bar();
    cout<<i<<endl;
    return 0;
}

在这种情况下,当n的执行完成时,静态变量bar()将不会被销毁,当程序终止时它将被销毁。