免费注册 查看新帖 |

Chinaunix

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

关于内存泄漏 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-23 11:43 |只看该作者 |倒序浏览
在使用c语言编程时,哪些情况下容易照成内存泄漏,比如说malloc分配了内存没有释放等等。哪位老兄能否列举哪些情况下容易产生泄漏?对应的如何防止这些情况照成的内存泄漏。谢了!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2007-06-23 12:02 |只看该作者
原帖由 pushmao 于 2007-6-23 11:43 发表
在使用c语言编程时,哪些情况下容易照成内存泄漏,比如说malloc分配了内存没有释放等等。哪位老兄能否列举哪些情况下容易产生泄漏?对应的如何防止这些情况照成的内存泄漏。谢了!

产生内存泄漏的就是你比如的那个情况,至于防止嘛,释放一下就可以了。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2007-06-23 12:13 |只看该作者
原帖由 pushmao 于 2007-6-23 11:43 发表
在使用c语言编程时,哪些情况下容易照成内存泄漏,比如说malloc分配了内存没有释放等等。哪位老兄能否列举哪些情况下容易产生泄漏?对应的如何防止这些情况照成的内存泄漏。谢了!

严格说起来,泄漏指的是资源分配(及使用)后,(在进程生存期间)无法将其回收的情况。例如:

  1. char *p = malloc(100);
  2. p = NULL;
复制代码

那么这段通过 malloc 分配的内存,在该进程生存期间是无法被回收的。不过,一些分配后没有回收(而不是像上边的无法回收)的情况,也称为泄漏。例如:

  1. char *p = malloc(100);
  2. /* 从来不用这段内存(也不释放),也不对 p 重新赋值 */
复制代码

这段通过 malloc 分配的内存也可以认为是泄漏了。

[ 本帖最后由 MMMIX 于 2007-6-23 12:15 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-06-23 12:15 |只看该作者
原帖由 pushmao 于 2007-6-23 11:43 发表
在使用c语言编程时,哪些情况下容易照成内存泄漏,比如说malloc分配了内存没有释放等等。哪位老兄能否列举哪些情况下容易产生泄漏?对应的如何防止这些情况照成的内存泄漏。谢了!


内存泄漏就是指你分配的内存没有相应地去释放掉.
如:

  1. char *p = (char*)malloc(10);
  2. char *q = (char*)malloc(10);
复制代码


然后你再

  1. q = p;
复制代码

即让q指向p所指向的内存空间, 此时q以前所指向的内存空间就不能够访问, 以释放那一块内存, 所以就出现了内存泄漏, 要避免这个情况, 就是要一个malloc()对应一个free(). 并且在对指针赋值前, 要确定这个指针是否为NULL.

一个更通用的方法是:

  1. char *p = NULL;
  2. p = (char*)malloc(10);
  3. if (p == NULL)
  4. {}
  5. /*
  6. */

  7. free(p);
  8. p = NULL;
复制代码


然后你每次使用p时都检查其是否为NULL.

论坛徽章:
0
5 [报告]
发表于 2007-06-24 12:08 |只看该作者
谢谢几位的回复!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2007-06-24 12:20 |只看该作者
原帖由 mynets 于 2007-6-23 13:24 发表
道理大家都明白,关键是要在复杂的daemon中避免,还是不容易的

嗯,所以有“站着说话不腰疼”一说

论坛徽章:
27
处女座
日期:2016-04-18 14:00:4515-16赛季CBA联赛之福建
日期:2023-03-31 15:54:2315-16赛季CBA联赛之深圳
日期:2020-06-02 10:10:5015-16赛季CBA联赛之广夏
日期:2019-07-23 16:59:452016科比退役纪念章
日期:2019-06-26 16:59:1315-16赛季CBA联赛之天津
日期:2019-05-28 14:25:1915-16赛季CBA联赛之青岛
日期:2019-05-16 10:14:082016科比退役纪念章
日期:2019-01-11 14:44:062016科比退役纪念章
日期:2018-07-18 16:17:4015-16赛季CBA联赛之上海
日期:2017-08-22 18:18:5515-16赛季CBA联赛之江苏
日期:2017-08-04 17:00:4715-16赛季CBA联赛之佛山
日期:2017-02-20 18:21:13
7 [报告]
发表于 2007-06-24 14:34 |只看该作者
呵呵。。。

这也是C和C++程序员最头痛的地方

论坛徽章:
0
8 [报告]
发表于 2007-06-24 20:06 |只看该作者
p = malloc
if (...) {
   free(p);
}

这种代码就出问题了,而且很容易范

论坛徽章:
0
9 [报告]
发表于 2007-06-24 20:31 |只看该作者
原帖由 pushmao 于 2007-6-23 11:43 发表
在使用c语言编程时,哪些情况下容易照成内存泄漏,比如说malloc分配了内存没有释放等等。哪位老兄能否列举哪些情况下容易产生泄漏?对应的如何防止这些情况照成的内存泄漏。谢了!


你用alloc系列函数分配一块内存
p = xalloc(size);
然后你对p重新赋值,比如
p = 0;
p = malloc(size);
只要你对指针重新赋值之前没有free就会产生泄露。
另外要记住
p = strdup(s);
也隐含调用了malloc,一个建议是永远不要使用strdup。

论坛徽章:
0
10 [报告]
发表于 2007-06-24 20:43 |只看该作者
原帖由 mynets 于 2007-6-23 13:24 发表
道理大家都明白,关键是要在复杂的daemon中避免,还是不容易的

在有些daemon中,虽然一次只泄漏一点点,时间长了,可就不得了了,这种错误不容易发现,还是推荐用valgrind跑一下先
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP