函数中局部变量的返回

来源:互联网 发布:proface触摸屏软件下载 编辑:程序博客网 时间:2024/06/05 04:55

函数不能返回指向栈内存的指针!


      为什么?因为返回的都是值拷贝

      我们知道,局部变量的作用域是函数内部,函数一旦执行结束,栈上的局部变量会进行销毁,内存得到释放。因此,此时函数返回的是该局部变量的值拷贝,这是没有问题的。但是如果返回的是局部变量的地址,那么返回的只是该局部变量指针的拷贝,而随着函数运行结束,该拷贝指针所指向的栈内存已经被释放,那么指向一个未知区域就会导致调用的错误。


      那如果返回的指针指向的是堆内存,又会怎么样?

      这样的使用是没有问题的,在函数内new空间,在函数外delete空间。但是这样并不是一种好的编程风格,尽量在同一个作用域内进行new和delete操作,否则还要调用者手动进行内存的释放,试问这样的接口是不是很烂。如果确实需要这样做,那就传指针进去吧!


      好吧,通过几个典型的例子看一下,返回局部变量要注意的地方。

#include "fun_stdy.h"#include <iostream>using namespace std;int return_value0(){int ret = 0;cout << " in return_value0 , address and value:"<< &ret <<" "<< ret <<endl;return ret;//ok 最常见的情况, 返回局部变量的副本}int* return_value1()  {  int ret=1;  cout << " in return_value1 ,  and value:"<< &ret<<" " << ret <<endl;return &ret;//error 虽然value被释放 , 但里面的值可能不会被清除,所以有时候你这么用//看起来结果好像也是对的,但是隐患无穷。} int* return_value2()  {  int *ret = new int(2); cout << " in return_value2 , address and value:"<< &ret <<" " << ret <<endl;return ret;  //ok 在函数内申请空间,调用后需要调用者手动在函数外释放空间} int* return_value3(int *ret)//指针value不能为null,否则报错{  ret = new int(3);  cout << " in return_value3 ,  address and value:"<< &ret<<" " << ret <<endl;return ret;  //ok 在函数内申请空间,调用后需要调用者手动在函数外释放空间} char *return_value4(){char p[] = "hello world";cout << " in return_value4 ,  address and value:"<< &p<<" " << p <<endl;return p;    //p[]数组为函数内部局部变量,在函数返回后,内存已经被释放了,//所以在主函数中调用该函数str2 = return_value3();输出的可能为乱码}//此函数中p也是个局部变量,函数执行完自动销毁,但是指针分配的空间不会被自动回收,除非程序员delete掉。//所以这个可以正常输出。char *return_value5(){char *p = "hello world";//这个初始化的一种形式,相当于分配了sizeof(hello world)个空间cout << " in return_value5 ,  address and value:"<< &p <<" "<< p << endl;return p;}/*如果真要返回局部变量的引用和指针 ,请用static*/char *return_value6(){static char p[] = "hello world";cout << " in return_value6 , static_pointer's address and value:"<< &p <<" "<< p << endl;return p;}

#include <iostream>#include "fun_stdy.h"using namespace std;int main(int argc, char **argv){int *p ,*q;char *pchar;cout << " in main ,return_value0() :" << return_value0()<< endl<< endl;p = return_value1();cout << " in main ,return_value1() :" << p<< "" << *p << endl<< endl;p = return_value2();cout << " in main ,return_value2() :" << p<< "" << *p << endl<< endl;q = p;cout << " before return_value3 , q: " << q << ""  << *q <<endl<< endl;p = return_value3(q);cout << " in main ,return_value3() :" << p<< "" << *p << endl<< endl;cout << " after return_value3 , q: " << q << ""  << *q <<endl<< endl;pchar = return_value4();cout << " in main ,return_value3() :" << pchar<< "" << *pchar << endl<< endl;pchar = return_value5();cout << " in main ,return_value5() :" << pchar<< "" << *pchar << endl<< endl;pchar = return_value6();cout << " in main ,return_value6() :" << pchar<< "" << *pchar << endl<< endl;system("pause");return 0;}


0 0
原创粉丝点击