我已经知道当程序超出其范围时,该变量将被销毁。但是,当我尝试以下代码段中的代码时似乎没有发生这种情况:
int& somethin()
{
int x1 = 4;
return x1;
}
int main() {
int x11;
x11 = somethin();
cout << x11 << endl;
return 0;
}
令人惊讶的是,输出是:4
当我将“x11”声明为引用变量时,我得到了垃圾值。
任何解释?
注意:我多次重复这个测试。我不认为这是运气。 注意:有一个人在StackOverflow之前提出了同样的问题,答案是关于测试人员是幸运的。
答案 0 :(得分:3)
有任何解释吗?
行为未定义。
标准不保证未定义的行为会产生您期望的行为。它也不保证行为始终相同。在我的电脑上,结果是一个段错误。
对于它的价值,您可以想象实现:x1
存储在内存中的某处,因此值4在内存中的某处。在函数调用之后,该内存不再用于x1
,因此它可以用于其他内容。 x11
存储在内存中的某个位置。如果恰好使用相同的内存位置,则该内存位置中的垃圾值可能恰好为4。
当我将“x11”声明为引用变量时,我得到了垃圾值。
4也是垃圾值。
答案 1 :(得分:1)
本地变量存储在自动存储中。当它们超出范围时,它们就会被摧毁。
返回对局部变量的引用违反了语言规则,因此undefined behaviour
(就像取消引用nullptr
一样)。
话虽如此,但无法保证x11
的价值。它可以产生正确的结果,但这不是语言功能。
您可以在此处找到有关undefined behaviour
的更多信息:
What are all the common undefined behaviours that a C++ programmer should know about?