char *Buffer;
CString Dest;
Buffer=new char[100];
_lread(HFile,(LPVOID)Buffer, 100);
Dest=Buffer;
if(Buffer!=NULL)
   delete[] Buffer;//这种释放内存的方式有时候会出现不可以预料的异常,譬如自动退出程序如果改成以下的方式释放,那么就不会出异常,请问下面这种方式可以吗?是否安全?
if(Buffer!=NULL)
{
Buffer=NULL;
delete[] Buffer;
}

解决方案 »

  1.   

    if(Buffer!=NULL)为甚么要判断
    如果Buffer==NULL岂不是泄漏了
    直接delete[] Buffer;
      

  2.   

    正是因为不知道Buffer是否为NULL,所以才if(Buffer!=NULL)来判断的,if(Buffer==NULL)那么就不用delete了
      

  3.   

    1.Buffer=new char[100];   这里判断一下申请空间是否成功。如加上语句:
    if(NULL==Buffer)MessageBox("申请内存失败!");2.if(Buffer!=NULL)
       delete[] Buffer;//这种做法是正确的
    下面的做法是错误的:
    if(Buffer!=NULL)
    {
    Buffer=NULL;
    delete[] Buffer; // 这里Buffer已经为NULL,delete操作有何意义
    }Y___Y(一叶障目) 的话很搞笑,如果Buffer==NULL岂不是泄漏了?Buffer为NULL说明没有申请内存成功,何来泄漏3.你说这种释放内存的方式有时候会出现不可以预料的异常,譬如自动退出程序,我估计(注意是估计)是因为Dest=Buffer;这一句造成的。你把一个char*指针赋给一个CString对象,这没有什么大错,二者共享一片内存,但是最后你把char*指针拥有的内存释放了,但是CString对象的内存也没有了,但是CString对象的析构机制我们是不了解的,你这样把CString对象的内存去掉,CString对象自然要报错。
      

  4.   

    clever101(发现自己的问题越来越少人回答了,不知这是好事还是坏) ,感谢你这几天都回答过我的问题,你说的第3条非常有道理,我觉得也是Dest=Buffer;这一句造成的,但是不知道用什么办法来解决这个问题?希望能得到你再次的指点
      

  5.   

    CString Dest; // 改为char *Dest; 
        这样Dest=Buffer; 同是char*型,不存在CString对象析构问题,可以安全释放内存。
      

  6.   

    问题终于找到了,也不是Dest=Buffer这里的问题,问题是我new的时候分配的大小有问题
      

  7.   

    Dest=Buffer有问题吗?应该没有,
    if(Buffer!=NULL)
    {
    Buffer=NULL;
    delete[] Buffer;
    }
    是不是应该改为:
    if(Buffer!=NULL)
    {
    delete[] Buffer;
    Buffer=NULL;
    }
    先删除Buffer这个数组的内容,然后将这个指针置空