Codepad.org C ++代码给出了错误的结果

时间:2011-10-04 13:39:53

标签: c++ reference

只是一个小问题:

您能告诉我this代码中的问题是什么吗?它应该打印9,但它会4.8921e-270,但是,当取消注释第4行时,它也可以正常工作。
我不明白这里可能有什么问题。谢谢!

代码:

double& foo() {
  double x = 9;
  double &y = x;
  //cout << y << "\n";
  return y;
}

int main() {
  cout << foo() << "\n";
}

结果: 4.8921e-270

5 个答案:

答案 0 :(得分:8)

将强引用/指针返回到堆栈上的对象是一个错误的想法。当你离开这个功能时,它们很可能会被破坏。尝试按值返回:

double foo() {
  double x = 9;
  double &y = x;
  //cout << y << "\n";
  return y;
}

现在返回值已复制,而不是对可能不再存在的对象的引用。

答案 1 :(得分:4)

您正在返回对本地对象的引用,该对象在foo完成时不再存在,然后在您取消引用时获得未定义的行为。

答案 2 :(得分:1)

double foo() {
  double x = 9;
  double &y = x;
  //cout << y << "\n";
  return y;
}

永远不要在堆栈上返回对象的引用。当你离开这个职能时,他们很可能会消失。您可以尝试按值返回。

答案 3 :(得分:0)

返回对局部变量的引用 - 因为foo()返回后局部变量超出范围,该值不再存在。

所以你应该只是将返回类型更改为double(强烈推荐)并返回x或(如果你绝对想要/必须返回引用)使用静态变量:

double& foo() {
  static double x = 9;
  double &y = x;
  return y;
}

答案 4 :(得分:0)

我经常通过const ref:

返回类的数据成员
class BigThing {...};

class Foo
{
public:
   const BigThing & getBT() const { return bt; } // For constant BigThing.
   BigThing & getBT() { return bt; } // For mutable BigThing.
private:
   BigThing bt;
};

然后只要您的Foo实例在范围内(您不希望将ref返回到局部变量),那么使用getBT()之一应该是安全且有效的。