一个不小心引发的Heap corruption

阅读: 评论:0

一个不小心引发的Heap corruption

一个不小心引发的Heap corruption

一个不小心引发的Heap corruption

From: .aspx

今天写程序的时候碰到一个问题,调试的时候总是报错Heap corruption detected。一直没碰到过这样的问题,所以实在不知道如何下手。后来偶然一次注释掉一个释放语句,就没报错了Heap corruption detected了(但是报memory leak),才发现原来这个释放有问题。我的一个函数调用中,开始的时候分配了一个char数组,结束的时候释放这个数组空间,看起来完全是没有问题的,居然会引发Heap corruption detected。代码大体如下:
 
char* pCmd = new char[len+1];   // len has got value before
memset( pCmd, 0, len+1);
.........
for(int i=0;i<len;i++) {
      ........      //获取一个str内容形如:"1A", "0F"
      sscanf(str, "%02X", &pCmd[i]);
}
.....
delete [] pCmd;

找到问题的所在,再分析代码才发现了这其中一个很隐蔽的问题,就是那句sscanf,由于第二个参数用的是"%02X",那么对它而言,最后一个参数就是一个指向int类型的指针了,而我给的实际是一个char的指针。
如果上面的循环只进行到i<len-2,或者pCmd的size扩大到len+3,都可以避免heap corruption。
后来我干脆用了一个零时的int型变量来完成这个工作。

要分析这个问题,太理论化的我将不上来,应该是sscanf调用的过程中,由于pCmd分配到的空间不足,因此引发了新的分配,pCmd不再是像声明的那样一个len+1大小的char数组,因此直接调用delete [] pCmd就会引发heap corruption了。到底咋回事,也许还要高人来讲讲。

posted on 2007-04-10 17:39  SuperPlayeR 阅读(8524)  评论(3)   编辑  收藏  引用 所属分类:  C/C++

评论

#  re: 一个不小心引发的Heap corruption 2007-04-11 19:50  Paradoxiology 从VS.Net之后,CRT带的malloc都会在每次分配的内存块的前端和末尾增添一些额外的调试信息,每次free它们的时候都会检测一下,如果改变了就说明内存溢出之类的情况发生了。 
所以说heap corruption的引发是因为使用sscanf的时候覆盖了调试信息,sscanf本身是不会分配内存的。   回复   更多评论 
  
#  re: 一个不小心引发的Heap corruption 2007-04-11 23:41  nick to Paradoxiology: 
不是从 vs 开始的吧. 至少 vc6 就有了.   回复   更多评论 
  
#  re: 一个不小心引发的Heap corruption  2011-07-18 16:05  啊啊 应该是VC6 就有了,这个应该是一种基本的内存检测手段   回复   更多评论 

本文发布于:2024-01-28 11:14:52,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064116987028.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:小心   Heap   corruption
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23