首页 > 解决方案 > 为什么返回具有引用类型的局部变量在 VS2012 中有效

问题描述

我对在 VS2012 Update 5 中工作但在 g++ 8.1 中失败的以下代码感到非常困惑。

int& func()
{
    int i = 0;
    return i;
}

int main()
{
    int ri = func();
    ri++;
    std::cout << ri << std::endl; // output "1"
    return 0;
}

根据我的理解并参考类似的问题C++ Returning reference to local variable,它应该失败,因为函数中局部变量的生命周期i应该func在函数调用之后结束。

但是,为什么它在 VS2012 中工作?

在 VS2012 中运行

在 g++ 8.1.1 中失败 带有警告的 g​​++ 构建

在此处输入图像描述

它让我无法入睡。

更新 v1
添加 VS2012 指定版本并更改代码以使用变量ri

标签: c++visual-c++

解决方案


这是未定义的行为,这可能会随机工作,因为堆栈帧不会被新值覆盖并且能够访问内存位置(其中包含垃圾)。我们永远不应该返回对局部变量的引用。


推荐阅读