关于在函数中使用mollac和free的问题

rynewood 2009-01-27 10:31:08
mollac和free不成对出现会造成内存溢出?
有一代码片段,函数f的参数size是要分配的内存大小。那么给buffer分配了内存以后是不是还要free?如何free?
代码如下:
char *f(int size)
{
int i;
char *buffer = NULL;
buffer=(char *)malloc(size*sizeof(char));
for(i=0 ; i<size ; i++)
{
buffer[i]='c';
}
return buffer;
}
int main()
{
char *a=f(5);
return 1;
}
...全文
490 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oo_Oo_ 2009-01-29
  • 打赏
  • 举报
回复
泄露
michney 2009-01-29
  • 打赏
  • 举报
回复
里面分配就在里面释放
外面分配就在外面释放
这是习惯
Cloud_drift 2009-01-29
  • 打赏
  • 举报
回复
学习~
na2650945 2009-01-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yutaooo 的回复:]

如果是C++,你可以返回智能指针。

对于你这里,看上去C的样子。可以在main这一端调用free

C/C++ code
int main() {
char *a = f(5);
free (a);
return 1;
}




比较好的方式应该把重新分配 f 的职责为初始化,分配对象/释放对象的职责归main


C/C++ code

void initialize(char *buf, int len);
[/Quote]
学习了。
rynewood 2009-01-27
  • 打赏
  • 举报
回复
我也是这样写得。但是debug的时候在调用free以后的段点查看那个内存地址还是有原来的字符串,奇怪了
hityct1 2009-01-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 rynewood 的回复:]
debug看了一下,发现在main中free以后,函数里的buffer指向的地址内容还保存着字符串,没释放。难道buffer不能释放吗?
[/Quote]

mollac和free一定要成对。


char *f(int size)
{
int i;
char *buffer = NULL;
buffer=(char *)malloc(size*sizeof(char));
for(i=0 ; i <size ; i++)
{
buffer[i]='c';
}
return buffer;
}
int main()
{
char *a=f(5);
free(a);
return 1;
}





yutaooo 2009-01-27
  • 打赏
  • 举报
回复


int main() {
char *a = f(5);
free (a); /* 在这里释放呀 */
return 1;
}

rynewood 2009-01-27
  • 打赏
  • 举报
回复
请问如何调用free释放f()中分配的内存?
(如果buffer释放了就不能返回字符串了)
yutaooo 2009-01-27
  • 打赏
  • 举报
回复

进程结束,所有分配给这个进程的内存一定是回收了的。这也就是说,对你这个例子,如果在main中没有调用free释放内存,一旦进程结束内存也是被释放了的。这是由操作系统保证的。

然而,不应该依赖这样的能力。所以,在main中,应该调用free释放f()中分配的内存。
rynewood 2009-01-27
  • 打赏
  • 举报
回复
需要BUFFER返回字符串的,在main()后面还能不能释放buffer
rynewood 2009-01-27
  • 打赏
  • 举报
回复
是C(用gcc)
rynewood 2009-01-27
  • 打赏
  • 举报
回复
是C啊
yutaooo 2009-01-27
  • 打赏
  • 举报
回复

子函数中释放了buffer,返回的指针就是无效指针。这个指针所指向的内存已经被释放了。

另外问一下,LZ 在问 C 还是 C++ ?
rynewood 2009-01-27
  • 打赏
  • 举报
回复
请问怎么实现?在子函数释放的话,还能返回buffer?
waizqfor 2009-01-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 rynewood 的回复:]
debug看了一下,发现在main中free以后,函数里的buffer指向的地址内容还保存着字符串,没释放。难道buffer不能释放吗?
[/Quote]
你可以在子函数里 释放buffer 这样他就不存在了
rynewood 2009-01-27
  • 打赏
  • 举报
回复
debug看了一下,发现在main中free以后,函数里的buffer指向的地址内容还保存着字符串,没释放。难道buffer不能释放吗?
rynewood 2009-01-27
  • 打赏
  • 举报
回复
谢谢!!
waizqfor 2009-01-27
  • 打赏
  • 举报
回复
不用这段内存的时候 可以直接free了 如果不free的话 会造成内存溢出的
asmcer 2009-01-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 rynewood 的帖子:]
mollac和free不成对出现会造成内存溢出?
有一代码片段,函数f的参数size是要分配的内存大小。那么给buffer分配了内存以后是不是还要free?如何free?
代码如下:
char *f(int size)
{
int i;
char *buffer = NULL;
buffer=(char *)malloc(size*sizeof(char));
for(i=0 ; i <size ; i++)
{
buffer[i]='c';
}
return buffer;
}
int main()
{
char *a=f(5);
// Do something...
free(a);

return 1;
}
[/Quote]
yutaooo 2009-01-27
  • 打赏
  • 举报
回复

如果是C++,你可以返回智能指针。

对于你这里,看上去C的样子。可以在main这一端调用free

int main() {
char *a = f(5);
free (a);
return 1;
}


比较好的方式应该把重新分配 f 的职责为初始化,分配对象/释放对象的职责归main



void initialize(char *buf, int len);


加载更多回复(6)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧