LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 828|回复: 2

free和malloc隐藏的风险(建议大看看家)

[复制链接]
发表于 2004-11-25 10:38:42 | 显示全部楼层 |阅读模式
这两天调试一个嵌入式系统程序

一直受到malloc调用时出现段错误的困扰,百思不得其解

想着malloc这样的函数,从c语言出世那天就有了,应该不会出现这种bug

开始以为可能是pthread库引起的,因为程序里开了好几个线程,结果一一排除

郁闷了好几天。

后来发现在我在调用inet_ntoa()时,写了如下代码

char *buf=inet_ntoa();
...
if(buf)
    free(buf);

inet_ntoa()的man文档中,写了一句,它返回的字符串指针是静态分配的内存

我却调了free()函数

但是free()并不报告失败,而是在你紧接着下次调用malloc时报告段错误。

分析了一下,想是可能因为,free并不检查释放的是否是动态分配的内存还是静态分配的内存,它直接把传过来的地址,挂到堆链上了,下次malloc调用时,发现这个地址是只读的,结果出现段违例

大家不相信,可以free一下自己static定义的内存,紧接着malloc一下
发表于 2004-11-25 10:51:20 | 显示全部楼层
malloc系统函数都会维护一个空闲块链表,申请时从空闲链表上摘下一块大小合适的来分配给申请者,free时只是把这个块作上空闲标记,以供下次分配。理解这个机制后,很多奇怪的问题就好理解了。
发表于 2004-11-25 16:53:38 | 显示全部楼层

呵呵受教!!

呵呵受教!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表