vc内存释放问题

在vc制作MFC之静态DLL时使用new分配内存后在使用delete时有时会报错并且几率比较高,主要有下面的原因:

一、内存已经被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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值