通过引用返回局部变量

returning local variables by reference

本文关键字:局部变量 返回 引用      更新时间:2023-10-16

>我有以下代码:

        int& func(int i){
          int *p = &i;
          return *p;
        }
        int& func2(int i){
          vector<int> v;
          v.push_back(i);
          return v[0];
        }
        int & func3(int i){
          array<int,4> arr;
          arr[0] = i;
          return arr[0];
        }
        int& func4(int i){
          int j = i;
          return j;
        }
    int main(){
      cout<<func(3)<<endl;
      cout<<func2(10)<<endl;
      cout<<func3(100)<<endl;
      cout<<func4(123)<<endl;
    return 0;
    }
outuput:
3
0
100
segmentation faul(core dumped)

调用 func 没关系,因为虽然 p 是本地的 *p 是 i ,并且我生活在全局范围内(?调用 func2 返回 0,这对我来说没有意义,我预计会出现分段错误,因为 v 是本地向量......调用 func3 返回正确的值,这也没有意义,原因与上述相同。调用 func4 终于做到了我所期望的,给了 Segmentatioun 错误

有人可以帮助我了解深渊中发生的事情吗? 为什么向量和数组在被声明为静态时工作? 事实上,考虑到所有函数都在返回引用,我预计会出现分割错误,因为向量和数组是本地对象,一旦函数结束,它们应该被删除。

非常感谢

那里正在发生未定义的行为。通过引用返回局部参数或变量是未定义的行为,与返回地址的方式相同。

如果你想要或必须返回一个引用,那么使用一个静态变量:

int& my_func(int variable)
{
  static int some_value = 0;
  some_value = variable;
  return some_value;
}

关键字 static 告诉编译器,变量在执行离开函数后将具有生存期。

要返回引用,您需要引用一个在执行离开函数后不会消失的变量。