c++中函数的内存注意项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++中函数的内存注意项相关的知识,希望对你有一定的参考价值。

函数不能返回指向栈内存的指针!因为返回的都是值拷贝!

char *str = "abcd"这样就是字符串常量,这种能返回,而char str[] = "abcd"就不能在函数中返回了,因为这个是局部变量,函数结束后就内存释放了

如果非要进行返回局部变量,就只能用static来限制局部变量了,这样函数结束后就不会释放这个变量的内存了。

或者在被调用函数中用new命令申请空间,然后在调用完毕返回后用delete释放空间,不过这样做的坏处是接口不友好。

  下面是四种情况分析

1.正确。最normal的情况。
int returnValue();  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    std::cout<<returnValue();  
    return 0;  
}  
  
char returnValue()  
{  
    int value=3;  
    return value;  
}  
 
 2.错误。最normal错误。虽然value被释放,但是它的值不一定会被清除,所以有时候你这么用看起来结果好像也是对的,但是隐患无穷。
[cpp]  
int* returnValue();  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    std::cout<<*(returnValue());  
    return 0;  
}  
  
int* returnValue()  
{  
    int value=3; 
    return &value;  
}  
 
3.正确。不用奇怪,“HelloJacky”是一个字符串常量,储存在只读数据段,return str只是返回了该字符串在只读数据段所在的首地址,当函数退出后,该字符串所在的内存不会被回收,所以是正常的。
[cpp] 
char* returnValue();  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    std::cout<<returnValue();  
    return 0;  
}  
  
char* returnValue()  
{  
    char* str="HelloJacky";  
    return str;  
}  
 
4.错误。这一回“HelloJacky”是栈内的局部变量,函数退出时内存被释放,因此返回栈内局部变量的地址是错误的。
[cpp]  
char* returnValue();  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    std::cout<<returnValue();  
    return 0;  
}  
  
char* returnValue()  
{  
    char str[]="HelloJacky";  
    return str;  
}  

以上是关于c++中函数的内存注意项的主要内容,如果未能解决你的问题,请参考以下文章

c++ 函数指针实例详解

代码质量控制 & 编程注意项

C:函数 注意点

c++的lambda使用注意事项,可能导致的崩溃问题分析

C++ length()、size()、sizeof()三者的区别

C++ 数据类型提高+内存四区