解决堆损坏的一点心得
2015-09-15 19:51
253 查看
解决堆损坏的一点心得
程序在运行时出现中断,中断信息为:Windows已在ApplicationGUI.exe中触发一个断点。其原因可能是堆被损坏,这说明ApplicationGUI.exe中或它所加载的任何DLL中有Bug。
点击中断信息框中的继续,出现如下提示信息:
从中断信息中可以看出,程序中断的原因是堆被损坏。百度了一下图片2中的错误信息,大概明白是内存分配出了问题。
然而正如上面所说的那样,使用断点调试根本无法定位到真正出现问题的代码语句。因此,我使用了之前用过的“注释法”。具体做法是,注释掉for语句完后的所有代码,在f函数中只保留code A代码,如果程序出现中断,则从code A的末尾开始,从后往上逐渐注释掉code A中的代码,如果程序没有出现中断,说明引起中断的位置不在code A中,因此要从code A代码的末尾开始,从后往下逐渐去除掉它下面的代码的注释。
在我的这个问题中,当我注释掉for语句之后的代码后,程序中断了,说明引起中断的代码就在code A中,依次缩小范围,最终找到了问题的根源。原来是在读取文件的时候,声明的空间小于文件中的内容,因此出现了指针的越界。
问题描述
之前在实现水印提取的过程中,遇到了一个诡异的异常。为了较好的说明出现问题的情况,假定我运行的函数为f(),其代码如下:f() { code A;//该段代码在读取一个文件中的记录 for(int i = 0; i < 3; i ++) { code B; } }
程序在运行时出现中断,中断信息为:Windows已在ApplicationGUI.exe中触发一个断点。其原因可能是堆被损坏,这说明ApplicationGUI.exe中或它所加载的任何DLL中有Bug。
点击中断信息框中的继续,出现如下提示信息:
从中断信息中可以看出,程序中断的原因是堆被损坏。百度了一下图片2中的错误信息,大概明白是内存分配出了问题。
解决方案
于是开始使用断点调试,发现程序中断的位置不确定,有时在运行code A时中断,有时在第一次运行code B时中断,有时在运行完所有代码,即将退出f函数时中断。这让我费了相当长的时间来调试程序。然而正如上面所说的那样,使用断点调试根本无法定位到真正出现问题的代码语句。因此,我使用了之前用过的“注释法”。具体做法是,注释掉for语句完后的所有代码,在f函数中只保留code A代码,如果程序出现中断,则从code A的末尾开始,从后往上逐渐注释掉code A中的代码,如果程序没有出现中断,说明引起中断的位置不在code A中,因此要从code A代码的末尾开始,从后往下逐渐去除掉它下面的代码的注释。
在我的这个问题中,当我注释掉for语句之后的代码后,程序中断了,说明引起中断的代码就在code A中,依次缩小范围,最终找到了问题的根源。原来是在读取文件的时候,声明的空间小于文件中的内容,因此出现了指针的越界。
总结
这种内存分配和释放引起的错误虽然比逻辑错误更加容易发现,但这种错误往往也不好定位到具体的位置,因此,在设置到分配内存空间,为指针申请内存的时候,一定要仔细,避免出现上述错误。相关文章推荐
- 分享一个典型的应用部署架构图
- iOS开发--多线程 并行开发
- 如何向Gnome桌面中的顶端面板添加项目
- SUDTOJ 3323园艺问题 (线段树)
- Delphi 截取被遮挡窗口图片
- UISlider
- python笔记之中缀语法和管道实现
- 大数据竞赛平台——Kaggle 入门(转)
- Nvidia Nsight + .NET
- SUDTOJ 3323园艺问题 (线段树)
- 雨林木风Win10开始菜单点开很慢怎么办?Win10开始菜单反应迟钝解决方法
- Android Studio 代码页面保护色配置
- Mediarecorder录音
- 14级结训赛3314-扩展欧几里德
- 从一台2005数据库备份后 ,想到另一台2005数据恢复 但发生 备份集中的数据库备份与现有的XX 数据库不同 选择覆盖现有数据库 也不行
- 台大机器学习第一讲
- 2015广东移动“灯塔计划”暑期实习面试小记
- javascript判断非空
- python笔记之bisect模块
- python笔记之常用模块用法分析