免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3148 | 回复: 8
打印 上一主题 下一主题

[C] C语言预防内存泄漏的新方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-21 10:10 |只看该作者 |倒序浏览
C/C++中内存泄漏是最被诟病的问题,C++借助析构的便利有效抑制了一些内存泄漏,
而C语言就很无助了.要么增加新语法,要么在写法上做些预防.
内存申请和释放像一对双胞胎,释放多了少了都成问题:
char* buff=(char*)malloc(80);
...
free(buff); //必须一次
观察C++中析构的时机,它总出现在}之时,我们也可以利用{}这对双胞胎来帮忙:
{ char* buff=(char*)malloc(80);
...
free(buff); //必须一次
}
规则就是:紧跟{后同一行的是申请;紧挨}行前的是释放.分析一下这么写的效果:
1. 申请与{在同一行,容易辨认检查
2. 释放紧挨}也容易辨认检查
3. 如果忘了释放,也会少写},肯定编译不过
4. 申请的变量只在{}有效,在后面重复释放也编译不过
还是有些效果的,但写法让人不舒服, 因为{}关系到缩进,也不利于搜索,改进一下:
#define _ {
#define __ }
_ char* buff=(char*)malloc(80);
...
free(buff);
__
_像后缩,__像空行,很容易辨认, 如果申请了多个资源变量,多个__可以合并在一行:
_ char* buff=(char*)malloc(80);
...
_ CThis t;
CThis_CThis(&t); //构造
...
CThis_(&t); //析造
free(buff);
__ __
当然这种写法肯定不能解决所有问题,在_和__之间的break continue和return不受约束.
但代码比原来清晰,也比原来容易检查出错误.

最后,我给出一个彻底解决释放的问题,就是增加新语法:
{
: //无名标号,不能跳过
}
在 {}中加入可选的:,break continue和return都必须执行.

论坛徽章:
324
射手座
日期: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
2 [报告]
发表于 2010-07-21 10:14 |只看该作者
这算啥方法

论坛徽章:
0
3 [报告]
发表于 2010-07-21 10:15 |只看该作者
提高人的素质才是王道。

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
4 [报告]
发表于 2010-07-21 10:19 |只看该作者
写一个好的内存池?

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
5 [报告]
发表于 2010-07-21 10:28 |只看该作者
lz没怎么写过C程序,鉴定完毕

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
6 [报告]
发表于 2010-07-21 10:36 |只看该作者
本帖最后由 vbs100 于 2010-07-21 10:38 编辑


你以为申请的内存一定会在一个函数内释放吗?

论坛徽章:
0
7 [报告]
发表于 2010-07-21 10:40 |只看该作者

难为你打了这么多字

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
8 [报告]
发表于 2010-07-21 10:43 |只看该作者
你以为申请的内存一定会在一个函数内释放吗?
vbs100 发表于 2010-07-21 10:36



    这句话是重点!

论坛徽章:
0
9 [报告]
发表于 2010-07-21 10:52 |只看该作者
还以为发现新大陆了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP