解决堆损坏的一点心得

问题描述

之前在实现水印提取的过程中,遇到了一个诡异的异常。为了较好的说明出现问题的情况,假定我运行的函数为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中,依次缩小范围,最终找到了问题的根源。原来是在读取文件的时候,声明的空间小于文件中的内容,因此出现了指针的越界。

总结

这种内存分配和释放引起的错误虽然比逻辑错误更加容易发现,但这种错误往往也不好定位到具体的位置,因此,在设置到分配内存空间,为指针申请内存的时候,一定要仔细,避免出现上述错误。

时间: 2024-08-25 13:34:54

解决堆损坏的一点心得的相关文章

FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中

<span style="font-size:18px;">//首先,获取数据库的路径,(如果不存在,就是我们想要存储的路径),不用担心每次都创建数据库会重复,不会的,如果没有则创建,有了就不会再重复创建: //接下来,我们要制表,首先我们先查看我们的表是否已经存在,方法在下面代码中:如果存在则跳过,不存在则创建</span> -(void)DataBaseInit { //获取Document文件夹下的数据库文件,没有则创建 NSString *dbPath

关于div布局的一点心得

如果是嵌套的div布局,外面的div 比如是<div  class="container"></div>这时候设置的是一个大的外框架,居中显示.我们要在里面嵌套div来 显示内容,这时候就通过<div style="display:block;position:relative"></div>来使得div标签的位置是相对于外面最靠近它的父级标签也就是<div  class="container"

关于现场技术支持的一点心得

技术支持本质上是一种专业服务,礼貌的沟通交流是成功的第一步,解决用户问题的同时并让用户保持愉快的心情是终极的目标; 一点心得体会如下: 1.到现场后先观察询问用户是否方便,这一礼貌的举动边唱好的开场戏,尤其是针对不同部门的技术相关领导哈! 2.弄清楚问题的具体现象; 3.根据经验和日志信息进行初步分析判断,缩小问题范围; 4.分析客户系统的环境,ISO版本.日期.软件rpm包版本.相关配置文件是否更改过; 5.与客户交流,分析做过什么操作; 6.over

关于敏捷和自动化测试的一点心得

中华传统文化源于<易>,成于孝,孝为德之本.孝顺:孝则顺,不孝则不顺. 不久前,参加Thoughtworks组织的一场自动化测试的分享,同事由于出差国外不能参加,特意嘱托我提问两个问题: 在互联网这个将"敏捷"与"持续集成"进行积极实践的环境里,"敏捷测试"与"自动化测试"成了一个大家经常探讨的话题, 那么自动化测试最佳的实行时间是在什么时候?如何推行最有效的自动化测试? 以下谨代表个人观点: 个人整理了一些测试最

单例设计模式的一点心得

解决的问题:保证内存中只有一个对像(比如多个程序使用同一个配置信息); 如 何 实现: 1.        不允许其它程序用new 创建该类对象 2.        在该类创建一个本类实例 3.        对外提值一个方法让其它程序获取该对象 步骤:        1.        私有化该类构造函数: 2.        通过new在本类中创建一个静态本类对象 3.        定义一个公有的.静态的方法,将创建的对象返回(一般为getInstance()) 饿汉式(开发时使用):  

开发微信支付的一点心得

由于使用了别人封装的微信公众平台SDK http://www.cnblogs.com/x3d/p/3740454.html  ,所以省去了完整理解开发手册的时间. 微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布.必须到你通过程序测试提交订单.发货通知等数据到微信的系统中,才能申请发布. 然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到二级三级目录下去,这对于使用MVC框架来说,是个小问题. 使用MVC,在开发环境,url往往是native url格

网页开发规则的一点心得

1.script文件放在body标签最后,script默认是 type="text/javascript",所以可以省略 2.css文件也要提取出来单独放在一个.css文件中用<link rel="stylesheet"  href="file address"  media="screen">引入文件中 3.建立scripts文件夹,用于放置脚本文件 4.建立css文件夹用于放置css文件 5.建立image文件

使用Appverifier 查找堆损坏

我们先看下面的代码 void ui::wnd::CDesktopWnd::Exe2Shortcut( LPCWSTR strFullPath, LPCWSTR strFileName, LPCWSTR shelllink_path) { CString strDescName = strFileName; if(strDescName == _T("iexplore.exe")) { strDescName = _T("Internet Explorer"); }

移动web动画设计的一点心得——css3实现跑步

[原]移动web动画设计的一点心得——css3实现跑步 今年3月份,由于公司业务需要,我转岗到微信产品部,离开了TID团队,人都是有感情的动物,更何况在一个团队呆了快 3 年,心中十分舍不得,鬼哥说了“天下没有不散的宴席...”,在我的世界里又多了一次离别的伤感(虽然还在隔壁工作).加入了微信产品中心后,开始新的团队生活,工作比以前忙多了,有时周六也要上班,需要更快更高效的完成任务,除了重构页面,需要主动参与边缘外的工作,承担更多.最近比较忙,给自己敲个响钟:注意身体. 说完题外话,开始近期的主