免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

如何有效的避免指针在释放之后被引用? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
91 [报告]
发表于 2008-11-12 23:25 |只看该作者
原帖由 JohnBull 于 2008-11-12 23:22 发表
我有一个办法,写程序的时候,桌子上放一些小细绳,把左手的手指分别定义成锁、互斥量、堆空间...
加锁、锁互斥量、分配堆的时候,在口曲纸上写上变量名,用绳子系在相应的手指上,解锁、解锁互斥量、释放堆的 ...

指头上绑绳子这做法挺 1 == a 的。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
92 [报告]
发表于 2008-11-13 15:56 |只看该作者
原帖由 flw 于 2008-11-12 23:25 发表

指头上绑绳子这做法挺 1 == a 的。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
93 [报告]
发表于 2008-11-13 15:57 |只看该作者
原帖由 雨过白鹭洲 于 2008-11-12 23:05 发表


我写代码从不把效率放在第一位,特别是所谓的优化技巧,花相当大的代价,换来的只是很小的性能提升,而且严重降低程序的可读性

只有程序性能核心部位或者性能瓶颈所在的地方,才需要特别关注效率


偶这里实现的就是网络数据包的处理,要修改数据包并发送回探包,应该是属于效率关注的地方。

论坛徽章:
0
94 [报告]
发表于 2008-11-13 16:09 |只看该作者
JC同志说“超过一屏的程序总会有bug的”

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
95 [报告]
发表于 2008-11-13 17:56 |只看该作者
buf[strlen(buf)]='\0'.

这个确实太2了。

论坛徽章:
0
96 [报告]
发表于 2008-11-13 20:15 |只看该作者
摆脱,睁大眼睛看,我写的是
strcpy(buf, str);
buf[strlen(str)] = '\0'


看清楚了,不是buf[strlen(buf)] = '\0'

strlen是查找\0的,但是strcpy并没有把\0写入buf之中,何来重复而言.
strncpy仅在当源字符串长度小于n的时候,才会在buf后写入\0,当源字符串大于等于n的时候,并没有往buf写入\0,因此无法保证buf是以\0结束的.

论坛徽章:
0
97 [报告]
发表于 2008-11-13 20:24 |只看该作者
原帖由 雨过白鹭洲 于 2008-11-12 23:05 发表


我写代码从不把效率放在第一位,特别是所谓的优化技巧,花相当大的代价,换来的只是很小的性能提升,而且严重降低程序的可读性

只有程序性能核心部位或者性能瓶颈所在的地方,才需要特别关注效率



不知道阁下是否写过防火墙之类的软件,这些软件运行的时候对效率非常敏感.百兆环境下还好,千兆环境就很明显了.

论坛徽章:
0
98 [报告]
发表于 2008-11-13 20:48 |只看该作者
原帖由 smzgl 于 2008-11-13 20:15 发表
摆脱,睁大眼睛看,我写的是
strcpy(buf, str);
buf[strlen(str)] = '\0'


看清楚了,不是buf[strlen(buf)] = '\0'

strlen是查找\0的,但是strcpy并没有把\0写入buf之中,何来重复而言.
strncpy仅在当源 ...


第一句的strcpy,只要str长过buf容量,就缓冲区溢出了。
假设系统没崩溃,继续往下进行
第二句buf[strlen(str)] = '\0',还是重复动作,因为strlen返回的值大于buf容量

strncpy标准用法:
strncpy(buf, src, sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0';
len = strlen(buf);

[ 本帖最后由 wishel 于 2008-11-13 20:52 编辑 ]

论坛徽章:
0
99 [报告]
发表于 2008-11-13 20:50 |只看该作者
原帖由 smzgl 于 2008-11-13 20:24 发表



不知道阁下是否写过防火墙之类的软件,这些软件运行的时候对效率非常敏感.百兆环境下还好,千兆环境就很明显了.


人家第二句提到了 只有程序性能核心部位或者性能瓶颈所在的地方,才需要特别关注效率

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
100 [报告]
发表于 2008-11-13 20:56 |只看该作者
原帖由 smzgl 于 2008-11-13 20:15 发表
摆脱,睁大眼睛看,我写的是
strcpy(buf, str);
buf[strlen(str)] = '\0'


看清楚了,不是buf[strlen(buf)] = '\0'

strlen是查找\0的,但是strcpy并没有把\0写入buf之中,何来重复而言.
strncpy仅在当源 ...



我实在想不出,
strcpy( buf, str );
buf[ strlen(str) ] = '\0';

buf[ strlen(buf) ] = '\0';
哪个更傻一些。

[ 本帖最后由 flw 于 2008-11-13 21:02 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP