33,311
社区成员
发帖
与我相关
我的任务
分享
所谓不能返回局部变量,是指局部变量在栈空间中分配内存,函数返回时栈指针回退,当主调函数继续调用其它被调函数时,栈指针上移,上一次函数调用所分配的空间会被本次调用覆盖,如果此时再引用原来的局部变量就会出现不可预见的结果。所以局部变量在函数返回时并不是被销毁而是相当于可被再次利用。
调用函数时,向操作系统申请栈空间,函数返回时,栈空间被回收,就好比你向房东租房子,退房后,房子里面的东西(栈空间的变量)或许不变,或许物是人非,但你无权过问。
再重复一遍:
函数退出时局部变量出栈,对象肯定是销毁了。
销毁指的是将那块内存标为空闲供其它变量使用,而该内存上的值仍然存在。
释放后那块内存并不是马上就被其他地方占用,根据实际情况起码会空闲一会,可能是一瞬间。如果你的程序较复杂,那这块内存可能很快就再次被使用,如果程序很简单,可能在很长一段时间内都是空闲。
所以在函数返回后将变量的值马上赋值给另外一个变量,局部变量已经销毁了,这块内存上的值还没来得及被修改,所以你的外部变量获得了一个正确的值。
所以你的结果正确并不代表变量没有被销毁。无论用引用还是变量来接受局部变量的值,局部变量肯定是已经销毁了的。
#include <iostream>
#include <string>
using namespace std;
int& Fun1()
{
static int num=123;//解决办法将其定义为静态变量
return num;
}
string& Fun2()
{
static string str="hello";
return str;
}
int main()
{
int mynum=Fun1();
cout<<mynum<<endl;
string my=Fun2();
cout<<my<<endl;
return 0;
}
int Fun1()//第二种没去掉引用,还有多种,这里不说了。
{
int num=123;
return num;
}
string Fun2()//去掉引用
{
string str="hello";
return str;
}
int main()
{
int mynum=Fun1();
cout<<mynum<<endl;
string my=Fun2();
cout<<my<<endl;
return 0;
}