免费注册 查看新帖 |

Chinaunix

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

free 实现不同? [复制链接]

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-21 22:26 |只看该作者 |倒序浏览
10可用积分
1. gcc 的时候,怎样查看链接的是哪个C库,比如:glibc 或者 libc等等

2. p1=p2=malloc(..); ...; free(p1); free(p2);

在aix 中运行时没有报错, 在linux中报错。 在aix中是用xlC 实现编译,linux用gcc编译

这个是应该与编译时链接的C库有不同? 也就是C库的实现不一样?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2009-04-21 22:57 |只看该作者

回复 #1 chenzhanyiczy 的帖子

2. p1=p2=malloc(..); ...; free(p1); free(p2);
对同一地址释放2次, 本来就是未定义行为。

在aix 中运行时没有报错, 是运气好 ……

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
3 [报告]
发表于 2009-04-21 23:05 |只看该作者
原帖由 OwnWaterloo 于 2009-4-21 22:57 发表
2. p1=p2=malloc(..); ...; free(p1); free(p2);
对同一地址释放2次, 本来就是未定义行为。

在aix 中运行时没有报错, 是运气好 ……


这个跟C库的实现有没有关系?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2009-04-21 23:30 |只看该作者

回复 #3 chenzhanyiczy 的帖子

有关系。

有的C库, 会检查对地址的重复释放。 可能会报告出这个错误, 也可能保持沉默。
另外一些C库, 就不允许对同一地址重复释放。


如果你只使用上面一类C库, 就可以这么写:
p1=p2=malloc(..); ...; free(p1); free(p2);

如果你打算移植到其他C库, 就要修改源代码, 禁止上面的对同一地址重复释放。
因为其他C库(以及C标准), 都没有对”同一地址重复释放“, 的行为作出任何保证。
它们作任何行为——比如挂掉程序—— 都是合理的。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
5 [报告]
发表于 2009-04-21 23:43 |只看该作者
原帖由 OwnWaterloo 于 2009-4-21 23:30 发表
有关系。

有的C库, 会检查对地址的重复释放。 可能会报告出这个错误, 也可能保持沉默。
另外一些C库, 就不允许对同一地址重复释放。


如果你只使用上面一类C库, 就可以这么写:
p1=p2=malloc(..); ...



恩,对于gcc来说,默认链接的C库 是 libc.a 还是glibc.a ??

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
6 [报告]
发表于 2009-04-21 23:51 |只看该作者

回复 #5 chenzhanyiczy 的帖子

这个我就不了解了 ……  我平时不怎么用gcc的……

可以试试 gcc -v
看看配置里面有没有说默认是链接到哪个库?

如果不行, 就只能等待其他用gcc的人来回答了~~~

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
7 [报告]
发表于 2009-04-22 00:51 |只看该作者
原帖由 chenzhanyiczy 于 2009-4-21 22:26 发表
1. gcc 的时候,怎样查看链接的是哪个C库,比如:glibc 或者 libc等等

2. p1=p2=malloc(..); ...; free(p1); free(p2);

在aix 中运行时没有报错, 在linux中报错。 在aix中是用xlC 实现编译,linux用gcc编 ...


aix中只是暂时没有出错,等出错的时候都不知道去哪里找, 一般都是你下次malloc(),free()的时候出错,到时候你会抱怨malloc(),free()有bug

论坛徽章:
0
8 [报告]
发表于 2009-04-22 01:42 |只看该作者
...
...
free(curr_node);
curr_node->prev->next = curr_node->next;
...

有些编译器是可以这样的,但是这样实际是不对的。
不要钻编译器的空子,不要耍它,不然它不一定什么时候会耍人。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
9 [报告]
发表于 2009-04-22 10:26 |只看该作者
原帖由 Blueskin 于 2009-4-22 01:42 发表
...
...
free(curr_node);
curr_node->prev->next = curr_node->next;
...

有些编译器是可以这样的,但是这样实际是不对的。
不要钻编译器的空子,不要耍它,不然它不一定什么时候会耍人。



这个应该不关编译器的事,是与C库有关系,只是aix上和linux上的C库不同

论坛徽章:
0
10 [报告]
发表于 2009-04-22 10:28 |只看该作者
free 实现不同
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP