col*_*guy 5 c memory heap stack
老问题,但我仍然有一些想法.
char * getarrmal(void)
{
char *str;
str = (char *)malloc(10);
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = '\0';
return str;
}
char * getarrdef(void)
{
char *str = "hello";
return str;
}
char * getarrfix(void)
{
char str[10] = "world";
return str;
}
Run Code Online (Sandbox Code Playgroud)
三个功能.前两个将返回字符串地址,字符串存储在堆中,以便您可以继续使用它,例如main()函数.
在最后一个函数中,str是一个局部变量,并且不能使用返回的str.
我的问题是,当我返回调用前两个函数时,我应该手动释放它们吗?很容易相信malloc的情况确实如此,但我不确定它是否也是char*str ="hello"的情况.
如果我使用getarrdef()并且不释放它的返回值,那么我会以某种方式泄漏内存吗?
不,你绝对不应该尝试释放第二个。它不存储在堆中,而是一个字符串文字,尝试释放它是未定义的行为。从C++11 7.21.3.3 The free function:
...如果参数与内存管理函数先前返回的指针不匹配,或者如果空间已通过调用 free 或 realloc 释放,则行为未定义。
对于第一个,是的,分配内存的责任与内存本身一起传递是一个很好的做法。这意味着,如果某些东西分配了它并将其提供给您,那么您就有责任释放它。
即使您通过将其传递回函数来释放它,情况也是如此:delarrmal()- 通过这样做,您已经赋予该函数释放它的责任。
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |