从函数返回悬空引用

时间:2019-01-07 20:06:04

标签: c++ reference

我正在尝试测试有关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

很显然,这里我缺少一些东西。您是否同意我不应该这样做,并且有人可以指出这里出了什么问题吗?

1 个答案:

答案 0 :(得分:2)

  

它显示正确的值(而不是垃圾值)

不。它输出一个垃圾值。悬空参考没有正确的值。

  

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

您所缺少的是行为未定义。

  

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

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