有关内存释放的疑问

liqian99 2007-03-01 04:55:15
有一函数,返回值为
unsigned char* Func(void)
{
unsinged char* A;
A=malloc(10)
....
return A;
}
main()
{
unsigned char *B
B=malloc(10);
B=Func();
free(B);
}

当释放B时,是不是同时也释放了A,如果没有,怎样释放A.急需各位指点.
...全文
318 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dancewithgod 2007-03-02
  • 打赏
  • 举报
回复
malloc的使用是和free相配套的..

在对指针、内存操作的时候,一定要注意
qhgary 2007-03-02
  • 打赏
  • 举报
回复
另外你这样的设计不好,如果Func里面分配了空间,最好就在Func里面把空间释放掉,而不是退出到main函数里面再释放.当然有时候做到这个比较难,那么最好弄一个和分配空间函数Func对应的释放空间的函数FreeFunc,在调用Func的地方尽可能也调用FreeFunc.否则一旦东调西调,肯定会出现分配释放不配对的情况,即使逻辑上你检查都是配对的,在出现特殊分支或者异常的情况下,也会导致无法配对执行.
qhgary 2007-03-02
  • 打赏
  • 举报
回复
有一函数,返回值为
unsigned char* Func(void)
{
unsinged char* A;
A=malloc(10)
....
return A;
}
main()
{
unsigned char *B
B=malloc(10);
B=Func();
free(B);
}

当释放B时,是不是同时也释放了A,如果没有,怎样释放A.急需各位指点.

------------------------------------

释放B时,只是释放了A, 而B本身malloc(10)的空间将永远无法释放.
实际上B=malloc(10),系统给了一个地址给B, 而B=Func(),将先前的那个地址给永远的覆盖了.
zoco33 2007-03-01
  • 打赏
  • 举报
回复
这里解释一下,LZ的程序实际上是有问题的。

unsigned char* Func(void)
{
unsinged char* A;
A=malloc(10)
....
return A;
}
main()
{
unsigned char *B
B=malloc(10); //这里错了,根本就不应该有这一句。
B=Func();
free(B);
}

上面几位说的对,但是没解释明白。LZ就是想让B指向字符串A,但A已经在函数中申请空间了,在主函数中B就不用再申请空间了。LZ 这句:B=malloc(10);申请了内存空间, B=Func();是把B的指向改为了A所指的那段内存空间,而主函数中B申请的内存空间这时候由于没有了变量指向就泄漏了。free(B);是指把B指向的内存空间释放掉,这时候释放掉的就是函数中A申请的空间。最后程序结束了,B申请的空间根本就没有用到,而且由于后来B指向了A的空间,所以B申请的空间
也没有被释放。


正确的程序应该是:
unsigned char* Func(void)
{
unsinged char* A;
A=malloc(10);
....
return A;
}
main()
{
unsigned char *B;
B=Func(); //B指向A申请的空间
free(B); //释放了A申请的那段空间
}

guoshanhe 2007-03-01
  • 打赏
  • 举报
回复
内存泄漏了啊
操作系统在分配给程序内存时,会记下这段内存的首地址和大小,释放时只要调用free,参数是指向这段内存的首地址的指针就行,至于指针是否变换无关紧要,只要给的指针是指向这个首地址就行,也不用管这个内存段的大小
iambic 2007-03-01
  • 打赏
  • 举报
回复
看书补基础。
p_zyh 2007-03-01
  • 打赏
  • 举报
回复
A、B不指向值不表示内存释放啦啊
就是因为没有指针指向那块内存
才造成的内存泄漏啊
感觉lz对指针的概念以及指针和内存的关系还不是很清楚
liqian99 2007-03-01
  • 打赏
  • 举报
回复
但我给A付值后,测试打印结果,A,B都没指向值.
p_zyh 2007-03-01
  • 打赏
  • 举报
回复
seas110(迷@迷) 的说法是正确的,注释的也很清楚
要确认的话用内存泄漏的检查工具跑以下就知道了
liqian99 2007-03-01
  • 打赏
  • 举报
回复
有什么办法确定一下,很重要,谢谢各位了
bgqy2000 2007-03-01
  • 打赏
  • 举报
回复
应该是释放了
seas110 2007-03-01
  • 打赏
  • 举报
回复
main()
{
unsigned char *B
B=malloc(10); //B申请了空间
B=Func(); //B改变指向
free(B); //释放了A, 但没有释放B
}
hand_in_hand 2007-03-01
  • 打赏
  • 举报
回复
释放B时没有同时释放A。

可以将A设为全局变量,

然后在主函数尾free(A)。
iu_81 2007-03-01
  • 打赏
  • 举报
回复
释放了

69,370

社区成员

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

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