美好的一天 张艺兴:C++函数小问题

来源:百度文库 编辑:高校问答 时间:2024/05/11 05:47:50
请问:
如果函数返回一个引用,并且是引用的函数内部的一个临时变量变量
比如:
const int & fuc(void){
int temp=100;
return temp;
}
于是有一个语句:
int i;
i=fuc();

这一过程是错误的,原因是返回的是引用已经释放的内存(temp)

我的问题是: C++的函数,是先返回值以后才释放内存吗?对于上面
的i=fuc();语句,是在把函数的返回赋给i之前就已经释放了内存了吗?

-------------------------------
明显答案是肯定的,不过我还是希望得到大家的认可,我是初学者,目前还没看到书上的有关部分去,请各位高手指点!
哦,这只是一个例子而已
我只想知道函数,比如这个返回引用的函数,它释放内存的准确时刻

应该说是释放了内存(调用函数结束后)才赋值给i的;
不过你的程序运行时不会有问题的,你试过了吗?
稍作修改后你可以再看看这个程序:
#include <iostream>
using namespace std;
const int & fucc(const int & a,const int & b);
int main()
{
int i,j,m;
j=20;
m=30;
i=fucc(j,m);
cout<<i;
}

const int & fucc(const int & a,const int & b)
{
int temp;
temp=a+b;
return temp;
}
运行结果为正确的50
并没有出现问题
不过改程序确实是bad的,正如你说,它返回的是引用的其内部的变量temp
但是程序仍然能够进行的原因可能是将返回的引用又赋给i时,i是从一个临时copy那里得到的一个值而已
值得一提的是,该程序如果在visual stdio环境下,编译时会警告说你返回引用临时变量,其他的编译器可能不会提示,但更多情况下其他相似的错误程序是会导致程序崩溃的
在实际应用中应该避免编出这种程序

程序调用改函数时,当改函数返回值/结束时就立即释放内存了。

其实return语句等同于没有return时的大括号},这个其实就是函数结束的意思,所以再return前,局部变量全部释放。见到return或者}的时候,汇编代码是ret xx(有返回值就是xx,代表值,没有返回值就没有xx,直接是ret),直接返回不释放变量。

你在void 前后 & 就行了,就是如下:
const int & fuc(void &){
int temp=100;
return temp;
}
//---------------------------------------------------------------
int i;
i=fuc();
//---------------------------------------------------------------
这样引用就不是一个临时对象而是一个实体,我想你应该好好理解临时对象和
实体的区别

你到http://community.csdn.net/Expert/ForumsList.asp?typenum=1&roomid=56
问问吧那里高手很多的

i = fun();
fun()的返回值只在这个语句是有效的,因为在函数返回值时,在它的赋值表达式中是有一个值拷贝的,之后的表达式就无效.