从函数返回悬挂引用 我尝试测试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; }

从函数返回悬挂引用 我尝试测试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; },c++,reference,C++,Reference,对于gcc(4.8和7.3.0),我甚至没有收到任何警告。当我尝试运行可执行文件时,它在所有情况下(使用所有不同的编译器)都会打印正确的值(而不是垃圾值) 很明显,我在这里遗漏了一些东西。你同意我不应该这样做吗?有人能指出这里的问题是什么吗 它打印正确的值(而不是垃圾值) 不,它打印一个垃圾值。悬空引用没有正确的值 很明显,我在这里遗漏了一些东西 你缺少的是,行为是未定义的 打印两次将覆盖原始值。你知道为什么会这样吗 发生这种情况是因为行为未定义 未定义的行为意味着任何事情都可能发生,而不是你所

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

很明显,我在这里遗漏了一些东西。你同意我不应该这样做吗?有人能指出这里的问题是什么吗

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

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

很明显,我在这里遗漏了一些东西

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

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


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

未定义的行为意味着任何事情都可能发生,而不是你所期望的不会发生。未定义行为最糟糕的一点是,它通常看起来像是您的代码按预期工作,直到稍后您不再怀疑几周前编写的代码时它才停止工作。如果您打开优化器,g++将捕获该错误并提供警告。我的猜测是调试版本看得不够近,无法发现错误。我认识一个人,他在红灯时穿过街道,什么也没发生——他安全地降落在街道的另一边。为什么什么都没发生,当他们说这是不允许的时候?试着连续打印两次。原始值将得到overwritten@JorgePerez-没错,打印两次会覆盖原始值。你知道为什么会这样吗?
warning: reference to stack memory associated with local variable 'var' returned [-Wreturn-stack-address]
  return var_ref;
         ^~~~~~~
$ ./a.out
16991