通过引用返回局部变量
returning local variables by reference
>我有以下代码:
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
告诉编译器,变量在执行离开函数后将具有生存期。
要返回引用,您需要引用一个在执行离开函数后不会消失的变量。
相关文章:
- 返回对局部变量 - C++ 的引用
- libmysql:警告:返回局部变量"行"的地址(C++/C)
- Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量
- C++中局部变量和返回变量的构造和析构
- 在返回参数列表中C++局部变量(如CodeFights所示)
- 返回对局部变量的引用是否正常工作?
- 为什么 ++ 运算符触发器返回对局部变量警告的引用
- 返回捕获局部变量的 lambda
- 三元运算符:编译器不发出局部变量警告的返回引用
- 从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
- 为什么 C++ 编译器不警告返回对局部变量的引用
- 变量循环范围会导致返回局部变量的地址引用
- 通过引用返回局部变量
- 通过静态局部变量的参考/指针返回
- C++ 返回局部变量或临时变量
- 返回由引用指定的引用局部变量
- 返回静态局部变量作为引用
- 警告:返回局部变量'buffer'地址
- 没有返回对局部变量的引用的编译器警告
- 你能在C++中返回字符串对象的局部变量吗?