我正在尝试测试有关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
很显然,这里我缺少一些东西。您是否同意我不应该这样做,并且有人可以指出这里出了什么问题吗?
答案 0 :(得分:2)
它显示正确的值(而不是垃圾值)
不。它输出一个垃圾值。悬空参考没有正确的值。
很显然,这里我缺少一些东西。
您所缺少的是行为未定义。
打印两次会覆盖原始值。你知道为什么会这样吗?
发生这种情况是因为行为未定义。