您的位置:首页 > 其它

DAMAGE:After normal block(#****)

2012-10-23 15:48 288 查看
from:http://blog.163.com/sunny_110119/blog/static/37068271201022510025869/

最近在调试程序的时候,遇到这样一个错误:damage:after normal block(#286) at 0x003865D8.当时想了半天没有想明白,明明分配空间了,有地址的,为什么删除时报错呢?
代码如下:

PSubTree *SPSTree =new PSubTree[cn];//定义子后缀子树
for(k=0;k<=cn;++k) 。。。。。。。。。。。(1)
// for(k=0;k<cn;++k) 。。。。。。。。。。(2)
{
SPSTree[k].branch =NULL;
SPSTree[k].base_count[0] = PSTree[k].base_count [0];
SPSTree[k].base_count[1] = PSTree[k].base_count [1];
}
.......
delete []SPSTree;//运行到此处时报错
到网上去搜了下,发现是个内存溢出的问题。理解了之后,这个错误的意思也就显而易见了:正常的内存块之后有破坏,也就是你写过头了,占了别人的地盘,造成了破坏。反观上面的代码,使用(1)那句代码,k=cn的时候还在写,肯定越界了,造成了后面数据的破坏。屏蔽句(1)使用句(2),删除成功。

以下的是别人的总结,觉得写的挺好的,当初就是看了这个帖子才找到那段错误代码的,O(∩_∩)O~
转帖地址:http://blog.tianya.cn/blogger/post_show.asp?BlogID=624018&PostID=15160941


错误源头一,数组访问越界:

  大家先看如下一段程序:

  

   int* a = new int[5];

   a[5] = 3; // 这儿访问越界了

   delete[] a;

  在delete[] a;这句代码处将会出现:DAMAGE:After normal block(#93)的错误。

  

  错误源头二:

  

  

  char* pBuffer = new char[2];

  int v = 12345;

  memcpy(pBuffer, &v, sizeof(v));

  delete[] pBuffer;

  正如代码所表示的,我的缓冲区pBuffer有且仅分配了2Bytes的空间,然面我却向它塞了4Bytes的值,显然这是不正确的,DEBUG一下,将出现:DAMAGE:After normal block(#94)的错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: