为啥我在函数内部使用引用并通过引用返回它仍然有效? [复制]

Posted

技术标签:

【中文标题】为啥我在函数内部使用引用并通过引用返回它仍然有效? [复制]【英文标题】:Why I use reference inside the function and return it by reference still work? [duplicate]为什么我在函数内部使用引用并通过引用返回它仍然有效? [复制] 【发布时间】:2019-11-26 06:12:05 【问题描述】:

我知道函数中局部变量的生命周期将在函数完成后结束。但是我发现下面的例子,它可以工作。

int & foo()

  int b = 5;
  int &a = b;

  return a;



int main()

  int &c = foo();
  cout<<c;

  return 0;

另外,我尝试使用指针指向局部变量并返回指针。它也可以工作。

int * foo()
    int b = 5;
    int *a = &b;

    return a;



int main()

    int *c = foo();
    cout<<*c;

    return 0;

我很困惑。我了解到局部变量的生命周期将在函数完成后结束,因为局部变量存储在堆栈内存中。表示函数完成后,局部变量的内存将被释放。然后,指针或引用将不指向任何内容。

但是,上面的两个例子验证了我的概念是错误的。是什么原因?

【问题讨论】:

它恰好起作用。 work 这个词在这里没有意义。它对您有用,因为您希望打印出5。我希望 -1 被打印出来,所以对我来说,该程序无法工作。这就是未定义行为的结果。 【参考方案1】:

您的观察被称为未定义的行为:该语言对程序的行为没有任何限制。未定义行为的一种可能表现形式是事物看起来像是在“工作”。

但是您确实希望在您的程序中有任何未定义的行为。请勿使用该构造,即使它们看起来有效。

【讨论】:

但是你能解释一下为什么它可以工作吗?谢谢。 就一个具有未定义行为的程序争论没有多大意义。即使它今天似乎“工作”,但明天它可能会停止“工作”。为了满足您的好奇心,请查看生成的汇编代码。 @MichaelTsai 它不起作用。这就像掷骰子,期待 1 并得到 1,然后得出结论,骰子总是掷 1。到目前为止,这不是最好的类比,但它仍然比“它有效”更好地描述了这种情况

以上是关于为啥我在函数内部使用引用并通过引用返回它仍然有效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥静态内部类可以减轻内存泄漏?

安全地返回对内部节点的多个引用,同时仍然允许其他节点的突变

如何在向量内部引用一对?

为啥python不允许通过引用传递变量

如何通过cython接口返回对象引用的c ++函数

为啥复制构造函数应该在 C++ 中通过引用来接受它的参数?