HEAP CORRUPTION DETECTED: after Normal block (#93) at 0x008E3EA0.
CRT detected that the application wrote to memory after end of heap buffer.
这个意思大概就是溢出吧?
int *p = new int[N]的时候实际分配了大于N的空间,或称BLOCK。
这个BLOCK有BLOCK头,用户可用部分、BLOCK尾,指针p实际指向的就是用户可用部分。
BLOCK头、尾里面都有一些关于这个BLOCK的相关信息:堆链表指针,BLOCK大小,BLOCK类型,栅栏,校验和等等,而这些信息将在delete的时候检查它们的正确性。
例如你在使用p的时候发生了越界,破坏了BLOCK头或尾里面的一些信息,在delete的时候被检查出来就会报错。
顶楼的例子就是BLOCK尾被破坏的错误。
if(lpStr==NULL) _ERROR("str2str(...) toke a null string.");
char *lpTemp;
lpTemp=new char[strlen(lpStr)+1];
char *lpTempStr=lpTemp;
int nPstr=0;
while(*(lpStr+nPstr)!=NULL&&*(lpStr+nPstr)!=0x0a)
{
switch(*(lpStr+nPstr))
{
case '\'':
*lpTempStr=*(lpStr+nPstr);
lpTempStr++;
nPstr++;
while(*(lpStr+nPstr)!='\'')
{
if(*(lpStr+nPstr)==NULL||*(lpStr+nPstr)==0x0a)
_ERROR("Did u foget some " ?");
*lpTempStr=*(lpStr+nPstr);
lpTempStr++;
nPstr++;
if(*(lpStr+nPstr++)=='\\')
{
if(*(lpStr+nPstr)==NULL||*(lpStr+nPstr)==0x0a)
_ERROR("Did u foget some " ?");
*lpTempStr=*(lpStr+nPstr);
lpTempStr++;
nPstr++;
}
}
*lpTempStr=*(lpStr+nPstr);
nPstr++;
lpTempStr++;
break;
case '"':
*lpTempStr=*(lpStr+nPstr);
lpTempStr++;
nPstr++;
while(*(lpStr+nPstr)!='"')
{
if(*(lpStr+nPstr)==NULL||*(lpStr+nPstr)==0x0a)
_ERROR("Did u foget some \' ?");
*lpTempStr=*(lpStr+nPstr);
lpTempStr++;
nPstr++;
if(*(lpStr+nPstr++)=='\\')
{
if(*(lpStr+nPstr)==NULL||*(lpStr+nPstr)==0x0a)
_ERROR("Did u foget some \' ?");
*lpTempStr=*(lpStr+nPstr);
lpTempStr++;
nPstr++;
}
}
*lpTempStr=*(lpStr+nPstr);
nPstr++;
lpTempStr++;
break;
case 0x09:
case 0x20:
*lpTempStr=0x20;
lpTempStr++;
nPstr++;
while(Spaceword( *(lpStr+nPstr) )) nPstr++;
break;
default:
*lpTempStr=tolower(*(lpStr+(nPstr++)));
lpTempStr++;
}
}
*(lpTempStr++)=0x0a;
*lpTempStr=NULL;
strcpy(lpStr,lpTemp);
delete[] lpTemp;
}
复制代码
提示奇怪的
HEAP CORRUPTION DETECTED: after Normal block (#93) at 0x008E3EA0.
CRT detected that the application wrote to memory after end of heap buffer.
VS版本2005