讨论下所谓的桟内存和桟引用不能返回的问题:
桟中的内存存放的是函数运行时候的局部变量,在函数结束后,桟中的内存就会释放,桟中的变量包括函数实参和局部变量,在此应该注意在函数中用new动态分配的内存不会因为函数的结束而释放,因此可以返回其指针。
(注意:当返回桟中变量的指针和引用的时候,可以通过编译,编译过程只是提示警告信息,但是当运行时会出现错误)。
以下提供几种正确或者错误的例子。
变量非动态分配时,返回桟中的指针,运行时出错。
#include <iostream.h>
#include <stdlib.h>
char *get()
{
char *nn;
*nn='d';
return nn;
}
int main()
{
char *bb;
bb=get();
cout <<bb<<endl;
}
当动态分配内存的时候,可以返回桟中的指针,运行正确。
#include <iostream.h>
#include <stdlib.h>
char *get()
{
char *nn=new char;
*nn='d';
return nn;
}
int main()
{
char *bb;
bb=get();
cout <<bb<<endl;
}
返回实参的指针,由于实参也是桟中的变量,提示出错。
#include <iostream.h>
#include <stdlib.h>
char *get(char *pp)
{
*pp='d';
return pp;
}
int main()
{
char *bb,*aa;
bb=get(aa);
cout <<bb<<endl;
}
返回实参的引用,运行正确。
#include <iostream.h>
#include <stdlib.h>
char &get(char &pp)
{
pp='d';
return pp;
}
int main()
{
char bb,aa;
bb=get(aa);
cout <<bb<<endl;
}
返回局部变量的引用,虽然编译的时候有warning:reference to local variable 'pp'returned,但是运行正确。我认为此时是用于变量中的数据还没有被改写,所以可以读出正确数据,但由于此片内存已经被释放,所以其中数据随时有可能被改写。
总结,不管是指向实参的指针还是指向局部变量的指针都可以返回,指向实参的引用可以返回,指向局部变量的引用不可以返回。我认为原因是实参的指针只是一个备份,所以变量从桟中开辟,而实参的引用却是指向变量的引用,变量在函数外面已经开辟,所以不会因为函数的结果而释放,所以可以返回。