引用本地int变量

时间:2014-08-12 08:09:46

标签: c++

我有一个错误的函数,它返回对死字符串的引用:

std::string & ffff()
{
    std::string j = "12346";
    return j;
}

如果我打电话给std::string ii = ffff();我就崩溃了。这是正确和可以理解的。

但是现在我有了返回对int:

的引用的函数
int & ff()
{
  int g  = 1;
  return g;
}

当我尝试分配" dead"的参考时,我无法理解为什么我没有崩溃。 int gint i变量。

int  i = ff();

2 个答案:

答案 0 :(得分:1)

C ++标准不包含"崩溃"的概念。没有符合标准的确定性机制,您可以通过这种机制造成崩溃"。

程序的行为未定义,因此语言标准没有描述将要发生的事情。

答案 1 :(得分:0)

正如已经说过的那样,你处于“未定义行为”的境地,你应该期望:行为可能不是“正确和可理解的”。

如果您想了解编译器正在做什么,那么请查看生成的汇编程序。在那里,您将能够看到发生了什么,以及为什么会发生崩溃。

我的猜测(虽然我可能错了)是在退出函数时字符串被销毁,所以它显然是一个“死字符串”(使用你自己的术语,而不是一个非常严格的术语)。另一方面,返回int的引用... int不会被“销毁”,因为它不是对象。编译器可能会按值传递以简化操作 - 您是否返回引用以立即复制它?编译器应该看透。即使你将它封装在一个对象中,int的内存也是不变的,因此它应该仍然存在,甚至在被破坏时也可以使用。

无论如何,我看到你被投票了,因为它本身并不是一个非常有趣的问题。你问的是为什么在使用糟糕的编程实践时某些事情不会崩溃,这不是建设性的 - 我不会贬低,因为我也是一个真正好奇的程序员;)