一、内存已经被delete过,
二、内存访问越界,VC分配内存,除了分配你需要的内存空间外还会分配一些管理单元,就在你分配空间的上界和下界,比如内存边界标志(0xFDFDFDFD),如果是数组在上界会记录数组元素的个数,你要是修改了这些管理信息,delete的时候就会报错。
具体看下面的例子:
void _stdcall selpoint(char* path,double* xx,double* yy,double* zz,int* kk)
{
CString FileIN;
CStdioFile FileInName;
CFileException e;
int i=0;
int position=0;
CString tmp_arr[8];
double tvx;
double tvy;
double tvz;
byte* formview;
byte* formviewIter;
formview=new byte[(v_height+1)*(v_width+1)];//分配内存
formviewIter=formview;
for(int ii=1;ii<=(v_width*v_height)+1;ii++)//这里要注意从1开始初始化,不能从0否则修改了管理单元delete时报错
{
*(formviewIter+ii)='0';
}
FileIN=path;
FileInName.Open(FileIN,CFile::modeRead,&e);//Open FileIN For Input As #FileInName
while(total_num>0)
{
FileInName.ReadString(valstr);
split(valstr,",",tmp_arr);
tvx=atof(tmp_arr[0]);
tvy=atof(tmp_arr[1]);
tvz=atof(tmp_arr[2]);
Proj3Dto2D(tvx,tvy,tvz);
position=(int(tvy)-1)*v_width+int(tvx);
if((-10<(int(tvy-1))) && (position<0))
{
*(xx+i)=atof(tmp_arr[0]);
*(yy+i)=atof(tmp_arr[1]);
*(zz+i)=atof(tmp_arr[2]);
i++;
}
else
{
if((position>0) && (position<=(v_width*v_height)+1) && (*(formviewIter+position)=='0'))
{
*(xx+i)=atof(tmp_arr[0]);
*(yy+i)=atof(tmp_arr[1]);
*(zz+i)=atof(tmp_arr[2]);
i++;
*(formviewIter+position)='1';
}
}
total_num--;
}
*kk=i-1;
FileInName.Close();
if(formview)//判断是否为空
{
delete[] formview;
}
formview=NULL;
}