最近在研究一个算法,为了验证其效率就随手编写了一个代码。本以为没什么问题,结果一运行程序就卡住导致运行出错。
额。。。写个程序有Bug很正常的事情嘛,然而,就是这个Bug花了我一天的时间找错误。更令我沮丧的是,错误的源头竟然是。。。(买个关子,有兴趣的读者可以看看下面的伪代码找找错误,错误分析见最后)


我将C++代码主要部分列出,读者可以猜猜(错误新人也可能找到哦,主要是我太蠢了,哈哈 )

// 一个点的数据结构
class Point{...
}
queue<Point*> Q; // 一个用于保存点的队列
DS ds; // 一个用于组织点集的数据结构
// 检查该点的值是否满足要求
bool ValueCheck(Point *p){...
}
// 检查该点是否满足插入ds的要求
bool InsertCheck(Point *p){...
}
// 将一个点插入到ds中
bool Insert(Point *p){if(InsertCheck(p)){ //满足ds.insert(p);return true;}else return false;
}
void main(){...//假设Q中已经存放了许多点的地址,且每个地址都指向一个具体的Pointwhile(!Q.empty()){Point *p = Q.pop();if(Insert(p) && ValueCheck(p)){...}else{delete p;}}...
}

如果运行程序,一个非常有意思的现象是ds中的一些点不是原先Q中保存的点,同时在我编写的代码中,经常会导致代码运行错误,但有时候却可以正常运行。


错误分析:
其实,很显然这是一个关于内存不正当使用的一个问题。错误的原因就在Insert ( p )这句话这,如果一个点满足插入条件并插入ds中,但却不满足值检查(ValueCheck)条件,就会导致else语句块执行,也就是删除该点所在的内存空间,从而在最后查点的时候发现有异常的点。
一个很简单的办法是修改if(Insert( p ) && ValueCheck( p ))为if(ValueCheck( p ) && Insert( p )),即利用&&的短路机制,只有在满足值检查后,再进行插入检查和插入操作。
这篇文章主要是想提醒新人们,在new和delete时一定要仔细检查啊,千万不要和作者一样犯这么低级的错误。。。。。(= m =)

就是你这个bug浪费我一天时间?相关推荐

  1. 转【是什么浪费了我的时间 】

    是什么浪费了我的时间 这是一篇自我反思,因为我总觉得自己像个没头苍蝇:感觉有很多事要做,但其实又没做什么,把自己搞得很累却又没啥大的收获. 要么毫无追求,至少有个平淡的心态去享受每天的生活: 要么有所 ...

  2. 是什么浪费了我的时间

    本文转载自http://ixdba.blog.51cto.com/2895551/1590080 觉得写的很好,转载分享一下. 这是一篇自我反思,因为我总觉得自己像个没头苍蝇:感觉有很多事要做,但其实 ...

  3. 解决一个偶现的503 bug,花了俺不少时间

    概述 在3月2日晚上,大概8点左右,本想打道回府,回家休息,突然被人在bug群@了一下,说是管理后台,访问不了,界面上出现了: 503 service temporarily unavailable ...

  4. 【go-jira】go根据jql获取jira数据,包括total及bug的平均未解决时间

    起因 因为要获取Jira信息,所以有了前一个文章:GitLab和Jira集成,本来打算能集成后方便获取的jira信息的,万万没想到,没成功

  5. 电脑炸了,浪费我好几天时间,还是简要记下来吧

    为什么80%的码农都做不了架构师?>>>    我的小本本一直在兢兢业业的干活,然而前几天说炸就炸了...... 爆炸现场: 软件: windows10 pro + EIS11+  ...

  6. 收银系统读取服务器出错,今天超市收银系统出错,浪费了我好久时间

    晚上去世纪联华买东西,东西刷好付款有人跑来跟收银的说,有特价没有刷进去,变成原价了,然后自己拿到小票的时候留心了一把,果然自己买的特价也没有刷进去,收银员说不知道是系统崩溃还是怎么回事,今天晚上特价都 ...

  7. 怎么区分css还是html5,一文读懂HTML5和HTML4区别!

    HTML5自从2010年正式推出后,它以惊人速度发展,现在主流浏览器基本上都支持了HTML5(除了个别的特性在浏览器兼容有问题),这说明HTML5越来越受到欢迎.可以预测不久的将来HTML5会成为we ...

  8. libusb android 编译,Android如何对libusb进行编译和使用

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 最近项目中对usb进行使用的场景比较多,了解到libusb是比较出名的usb跨平台方案,学习libusb可以对andro ...

  9. 基于 FFMPEG 的视频编码(libavcodec ,致敬雷霄骅)

    基于 FFMPEG 的视频编码(libavcodec ,致敬雷霄骅) 本文参考了雷博士的博客: 最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265)) 还参考了另一篇博客: ...

最新文章

  1. 张杰和机器人_《80后脱口秀》吐槽高考 张杰化身“机器人”
  2. golang 调用 c 动态库so 静态库a
  3. Oracle11g EM界面乱码解决方法
  4. Css 浏览器兼容性及其其他常见问题
  5. 数据结构-----基于双数组的Trie树
  6. 异或!!不占用额外空间!!
  7. vue html属性绑定,2、Vue元素属性的绑定以及HTML的绑定
  8. 技术沙龙|赋能企业数字化转型,移动云云原生应用架构实践
  9. golang下的条件编译
  10. Ubuntu16.04下Nvidia+Cuda8.0+Dynet安装教程
  11. 身体排毒,自己就可以轻松搞定 - 生活至上,美容至尚!
  12. javaweb(ssh)体育赛事网上售票系统案例
  13. 计算机多媒体技术所处理的六个,多媒体技术
  14. android 获取刘海高度,不同刘海屏幕获取安全高度
  15. Spring+SpringMVC+MongoDB案例
  16. 大数据基础概念(三)
  17. php和phalcon,PHP_phalcon框架使用指南,初次认识phalcon是在刚学php的时
  18. vscode修改代码颜色
  19. Armstrong 一个n位数等于各个位数n次方之和
  20. RealSense D435——基本介绍

热门文章

  1. 【参赛作品85】openGauss2.1.0 for openEuler 21.09安装手记
  2. 黑客炼金术士 Seeker:可以攻破 4G 摸到你短信,还要为朝阳群众提供谍战工具...
  3. 写在2019年末的一些话
  4. 战士、魔法师与怪兽的战斗游戏
  5. 【windows7】在VMWare15.5 中安装 windows xp 系统
  6. swing 文本框回车事件
  7. java 模拟鼠标_java实现简单的模拟键盘鼠标操作
  8. NETSDK1061错误解决
  9. Dw 2020最新版下载地址 一键安装Windows
  10. 图文混排中,在textView的指定光标下插入文字或图片