免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3602 | 回复: 19

[C] 求教如何不漏释放内存,谢谢 [复制链接]

论坛徽章:
0
发表于 2015-01-21 14:59 |显示全部楼层
本帖最后由 bsdc 于 2015-01-21 15:00 编辑

请教下各位达人:关于一个比较长的函数内存释放问题
大致结构这样:
  1. void Free(void **ptr)                                                            
  2. {                                                                                
  3.     if (*ptr != NULL) {                                                         
  4.         free(*ptr);                                                              
  5.         *ptr = NULL;                                                            
  6.     }                                                                           
  7. }
  8. func()
  9. {
  10.      a = NULL, b = NULL;
  11.      a=malloc();
  12.      ......
  13.      if (exp)
  14.         goto ret;
  15.      ......
  16.      
  17.      b=malloc();
  18.      ......
  19.      if (exp)
  20.         goto ret;
  21.      ......
  22.      Free(&a); //xxx
  23.      ......
  24.      Free(&b); //yyy
  25.      ......

  26. ret:
  27.    Free(&a);
  28.    Free(&b);
  29. }
复制代码
为什么要在注释xxx和yyy处先释放,主要是分配的内存比较大,想及时释放,然后又怕中间很多goto,漏了free,所以搞了个Free函数,这样可以确保肯定能释放掉,也就是宁可多写几个,绝不漏释放,反正我Free释放后把指针置NULL了,下次再释放也会判断,不会double free,测下来还可以,不知道这样可行吗,请高人指正。

论坛徽章:
323
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2015-01-21 15:10 |显示全部楼层
是C的话就这样吧,想办法把长的函数搞短些更好

论坛徽章:
0
发表于 2015-01-21 15:15 |显示全部楼层
本帖最后由 bsdc 于 2015-01-21 15:22 编辑

多谢楼上建议,最近在优化,这是个jni程序,业务多了就堆到一起了,我一人之力也改变不了了,如果这样可以的话就安心了,这3个要求应该能满足就好:
1.内存不泄露
2.内存相对及时释放
3.不double free

论坛徽章:
1
戌狗
日期:2014-11-27 09:53:29
发表于 2015-01-21 16:16 |显示全部楼层
函数只提供一个出口设计,用于保证不遗漏
Free我一般自定义宏,跟你这差不多
#define FREE(res) if (res) free(res), res = NULL
你这已经做到场景要求了

论坛徽章:
0
发表于 2015-01-21 17:20 |显示全部楼层
本帖最后由 bsdc 于 2015-01-21 17:21 编辑

回复 4# shiqgnefu

嗯,不错,见识了,用宏更加简单

ps:”你这已经做到场景要求了“, 这句话我没理解呵呵

论坛徽章:
1
戌狗
日期:2014-11-27 09:53:29
发表于 2015-01-21 17:56 |显示全部楼层
回复 5# bsdc

代码已经做到你的三点要求了啊
   

论坛徽章:
0
发表于 2015-01-25 01:18 |显示全部楼层
一般来说,高级语言内存管理有几种思路,一个是放任不管,一个是构造/析构函数,一个是GC,还有一种是第三方设计的类似于APR的内存池。

放任不管即C语言的原始状态,构造/析构要求编译器和运行环境介入,GC则是交由运行环境全权管理,Java和.net以及其它一些平台用到的模式。至于apr_pool_t,可以看作malloc/free与GC的折中方案,原理是每申请一块资源就向APR备案一次,等你的代码执行完任务,由你通知APR删除整个pool,以及pool里所有备过案的资源,这样就不遗漏也不会double free。而如果你没有时间去自己实现一套代码,不妨直接调用APR,它是稳定、成熟的。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
发表于 2015-01-25 03:17 来自手机 |显示全部楼层
还有一种,就是将代码写成栈式结构。正常推出在函数中间,异常推出在最后。
实际上c都可以实现。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
发表于 2015-01-25 04:01 |显示全部楼层
C的栈式代码如下

  1. func()

  2. {

  3.      a, b;


  4.      ......

  5.      a = malloc();
  6.      if (a == NULL) {
  7.          ......

  8.      }else {
  9.          ......
  10.          b = malloc();
  11.          if (b == NULL) {
  12.              ......
  13.          }else {
  14.              ......
  15.              free(b);
  16.              ......
  17.          }

  18.          ......
  19.          free(a);
  20.          ......
  21.      }

  22.      ......

  23. }
复制代码

论坛徽章:
0
发表于 2015-01-26 09:38 |显示全部楼层
多谢楼上两位大神耐心指教
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP