为了账号安全,请及时绑定邮箱和手机立即绑定

请问关于c++函数返回值来传递动态内存问题,内容如下~

请问关于c++函数返回值来传递动态内存问题,内容如下~

青春有我 2022-01-01 10:06:00
下面这2个方法可以重新给str分配内存char *GetMemory3(int num){char *p = (char *)malloc(sizeof(char) * num);return p;}void Test3(void){char *str = NULL;str = GetMemory3(100); strcpy(str, "hello");cout<< str << endl;free(str); }下面这2个却不能,说函数返回的是栈内存,将自动消亡!难道上面那个函数不是栈内存,不会自动消亡吗?char *GetString(void){char p[] = "hello world";return p; // 编译器将提出警告}void Test4(void){char *str = NULL;str = GetString(); // str 的内容是垃圾cout<< str << endl;}不是说函数的局部变量都是在栈内存中申请的吗?那么方法一中的 char *p不是局部变量,不是在栈内存中吗?
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

指针就是一个表示内存位置整型数。所以函数返回指针时,实际就是返回一个表示内存位置的整型数。
char p[] = "hello world"; 这一句运行时候,指针的数值指示的是 "hello world"的内存位置,一个是"hello world"临时局部变量,是在栈上分配的,这个指针的数值是这个栈分配的数值,应该何函数返回地址差不了多少, GetString函数返回的也是这个指针数值,因为栈内存会随意用作其他用途,比如说分配给其他函数变量使用邓,所以这个数值保存的数据会被覆盖是无意义的,这个地址仅仅是在GetString函数运行时才被初始化为hello world,GetString函数调用完了,这个地址很快就被用作其他用途。
而GetMemory3返回的也是一个内存地址(指针),但这个地址是通过char *p = (char *)malloc(sizeof(char) * num); 得来的。 malloc这个函数确保这个地址是一个全局地址而且不会用作其他用途,所以这个指针指向的地址是永远有效的,知道你用free这个函数提示系统我不需要这个内存了,那么系统才会用作其他用途。 malloc获取的地址(指针)就是有这个特点,至于为什么有这个特点,那是人家规定的!!

查看完整回答
反对 回复 2022-01-04
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

需要释放,在函数体执行完毕时释放。

例如:
func
{

fn = new fn;
.
.
.

if(fn)
{
delete fn;
fn = NULL;
}

}





查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信