从函数返回悬空引用

Returning Dangling reference from a function

本文关键字:引用 返回 函数      更新时间:2023-10-16

我试图测试一些关于 c++ 中悬空引用的东西,并想出了以下代码

#include <iostream>
using namespace std;
int& get_int_ref() {
  int var = 16991;
  int &var_ref = var;
  return var_ref;
}
int main() {
  cout << get_int_ref() << endl;
  return 0;
}

当我尝试使用 clang (clang-1000.10.44.4) 编译此程序时,我正确地收到了悬而未决的引用警告:

warning: reference to stack memory associated with local variable 'var' returned [-Wreturn-stack-address]
  return var_ref;
         ^~~~~~~

使用 gcc(4.8 和 7.3.0),我什至没有收到警告。当我尝试运行可执行文件时,它会在所有情况下(使用所有不同的编译器)打印正确的值(而不是垃圾值)。

$ ./a.out
16991

显然,我在这里缺少一些东西。你会同意我不应该这样做吗,有人可以指出这里的问题是什么吗?

它打印正确的值(而不是垃圾值)

不。它打印垃圾值。悬空引用没有正确的值。

显然,我在这里缺少一些东西。

你缺少的是行为是未定义的。

将其打印两次将覆盖原始值。你知道为什么会这样吗?

发生这种情况是因为行为未定义。