重构发现:指针操作问题
浏览:3153次 出处信息
原来版本:
| 以下是代码片段: bool GetCookieUseName(const string& cookie_data, string& usename, const char * falg, const char endfalg) { char * p = strstr(cookie_data.c_str(), falg); if (p != NULL) { p += strlen(falg); for( ; *p != endfalg; p++) { usename += *p; } return true; } else usename=""; return false; } void Test( ) { string cookie( "name=aaaxx%" ); string usename; GetCookieUseName( cookie, usename, "name=", ’;’ ); cout << usename.c_str( ) << endl; } |
点评:
1. 严重的崩溃:没有检查p指向结束符,一旦cookie_data里有falg但没有endfalg,程序就一直for下去到崩溃。
解决:*p && *p != endfalg
2. 性能低下:usename += *p; 每个字符都调用一次basic_string& operator+=(E c),作为一个工具类函数,要考虑效率。
解决:应该是找到最后一个后,得到其长度,然后一次性调用basic_string& append(const E *s, size_type n);
3. 逻辑错误:如果只做第一点修改,程序虽然不崩溃了,但会把falg之后所有字符当作usename, 没有endfalg应该是找不到
合法的usename。
4. 代码组织差:头重脚轻型
简单改进版本:
| 以下是代码片段: bool GetCookieUseName(const string& cookie_data, string& usename, const char * falg, const char endfalg) { char * p = strstr(cookie_data.c_str(), falg); if (NULL == p) { usename=""; return false; // not found begin tag } p += strlen(falg); char * q = p; for ( ; *q && *q != endfalg; q++) {} if (*q == endfalg) { if (q == p) { usename=""; } else { usename.append( p, q - p ); } return true; } usename=""; return false; // not found end tag } |
建议继续学习:
- Linus:利用二级指针删除单向链表 (阅读:12521)
- C语言结构体里的成员数组和指针 (阅读:5716)
- 抵制代码重写 (阅读:4940)
- 如何避免重构带来的危险 (阅读:4232)
- 通过引用计数解决野指针的问题(C&C++) (阅读:4329)
- 什么是重构,什么不是重构 (阅读:4071)
- cpp智能指针的简单实现 (阅读:3760)
- C 语言中统一的函数指针 (阅读:3756)
- 前端重构实践(一) —— 性能优化 (阅读:3666)
- 实践中的重构 (阅读:3551)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:周末闲谈:C and C++, why use c++?
后一篇:工作在钱少事多人累的小公司里 >>
文章信息
- 作者:梁-兄 来源: C++博客-梁兄
- 标签: 指针 重构
- 发布时间:2009-11-02 21:05:07
建议继续学习
近3天十大热文
-
[926] WordPress插件开发 -- 在插件使用 -
[133] 解决 nginx 反向代理网页首尾出现神秘字 -
[52] 如何保证一个程序在单台服务器上只有唯一实例( -
[52] 整理了一份招PHP高级工程师的面试题 -
[50] 用 Jquery 模拟 select -
[50] 海量小文件存储 -
[50] 全站换域名时利用nginx和javascri -
[49] CloudSMS:免费匿名的云短信 -
[48] Innodb分表太多或者表分区太多,会导致内 -
[47] jQuery性能优化指南
