>我有以下代码:
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
告诉编译器,变量在执行离开函数后将具有生存期。
要返回引用,您需要引用一个在执行离开函数后不会消失的变量。