我有一个错误的函数,它返回对死字符串的引用:
std::string & ffff()
{
std::string j = "12346";
return j;
}
如果我打电话给std::string ii = ffff();
我就崩溃了。这是正确和可以理解的。
但是现在我有了返回对int:
的引用的函数int & ff()
{
int g = 1;
return g;
}
当我尝试分配" dead"的参考时,我无法理解为什么我没有崩溃。 int g
到int i
变量。
int i = ff();
答案 0 :(得分:1)
C ++标准不包含"崩溃"的概念。没有符合标准的确定性机制,您可以通过这种机制造成崩溃"。
程序的行为未定义,因此语言标准没有描述将要发生的事情。
答案 1 :(得分:0)
正如已经说过的那样,你处于“未定义行为”的境地,你应该期望:行为可能不是“正确和可理解的”。
如果您想了解编译器正在做什么,那么请查看生成的汇编程序。在那里,您将能够看到发生了什么,以及为什么会发生崩溃。
我的猜测(虽然我可能错了)是在退出函数时字符串被销毁,所以它显然是一个“死字符串”(使用你自己的术语,而不是一个非常严格的术语)。另一方面,返回int的引用... int不会被“销毁”,因为它不是对象。编译器可能会按值传递以简化操作 - 您是否返回引用以立即复制它?编译器应该看透。即使你将它封装在一个对象中,int的内存也是不变的,因此它应该仍然存在,甚至在被破坏时也可以使用。
无论如何,我看到你被投票了,因为它本身并不是一个非常有趣的问题。你问的是为什么在使用糟糕的编程实践时某些事情不会崩溃,这不是建设性的 - 我不会贬低,因为我也是一个真正好奇的程序员;)