delete与delete[]的区别

CSevenView::CSevenView()
{
// TODO: add construction code here
//-----------Begin------------------------------------------------------------------------
  //这是测试指针delete 与delete []释放的问题,
 CString str=_T("计算机科学与技术");
int length=WideCharToMultiByte(CP_OEMCP,NULL,str,-1,NULL,0,NULL,FALSE);
char * strAb=new char[length+1];
memset (strAb, 0, (length +1) * sizeof (char));
WideCharToMultiByte (CP_OEMCP,NULL,str,-1,strAb,length,NULL,FALSE);
delete [] strAb;
//```````````````````````````````````````````````````````````````````
//
测试结果:其实delete 与delete []没什么区别。                       `
//  用new[]开辟的空间,用delete释放不会出现内存泄露                    `
//  但一般强调用new[]开辟的空间,最好用delete[]释放最合理。  
//
测试总结:当我们用new【】分配的是基本数据类型时,用delete 和delete[]是没区别的,
//
但当我们用new【】分配的是自定义数据类型时,必须掉用delete[]的析构函数才行。
//````````````````````````````````````````````````````````````````````
//-----------End--------------------------------------------------------------------------

 //-----------Begin------------------------------------------------------------------------
 /*A*/
int * p=new int[100];  
 /*B*/
int num[100];          
 /*C*/
p=num;                  
 / *D*/
delete []p;            

 //测试结果:程序崩溃。
 //因为在p=new int [100]时 P的地址是指向堆中的一块内存区域。
 //当程序执行到p=num时,此时的P已经改变了,不在是指向堆的那块开配的区域。
 //当执行到delete [] p时,程序崩溃,原因是P现在指向的是num ,而num是在栈上的开辟的空间

 //并且p的地址是指向栈的,而在系统中栈中开辟的地址是有系统本身去释放,

 //而代码段C处却强制释放栈中开辟的空间

 //故程序崩溃。
//-----------End--------------------------------------------------------------------------


//-----------Begin------------------------------------------------------------------------
   /*A*/      int * p = new int[100];
   /*B*/    
*p=1;
   /*C*/     
p++;
   /*D*/    
*p=2;
   /*E*/     
delete [] p;
    //测试结果:程序崩溃。
    //原因是:代码段在A处,P是指向堆中开辟的内存区域,到了C处P的地址已经被改变了,
    //而在系统指针的释放(中堆中释放内存)是重首地址开始的,现在首地址被改变了,故程序崩溃
    //在堆中内存的释放只可以从首地址开始释放。
    //改如下:                
    //   /*A*/    
int * p = new int[100];
    //   /*B*/    
int * pack=p;
    //   /*C*/    
*p=1;
    //   /*D*/     
p++;
    //   /*E*/     
*p=2;
    //   /*F*/      
delete [] pack;
//````````````````````````````````````````````````````````````````````
//-----------End--------------------------------------------------------------------------



//-----------Begin------------------------------------------------------------------------
/*A*/    int * p =new int[10];
/*B*/    int * pLink=p;
/*C*/   delete []p;
/*D*/   delete []pLink;
   //测试结果:程序崩溃
   //原因:因为程序段只在堆中开辟了块内存区域,只是让 p ,pLink同时指向这个堆内存区,
   //当执行C时,开辟的内存已被释放了,在执行到D时,发现去释放已经被释放完的堆内存,故程序崩溃。
   //并没有new int【】二次,所以只需要一个释放就行。
//-----------End--------------------------------------------------------------------------

//-----------Begin------------------------------------------------------------------------
 /*A*/       int num=100;
 /*B*/
       int * p= & num;
 /*C*/
      delete p;
              //程序测试:程序崩溃。
              //原因是:p是指向的一个变量,而用delete 来释放是有问题的,变量是在栈上开辟的,是由系统自己释放,
             //而程序C处确强制delete掉,故崩溃。
//-----------End--------------------------------------------------------------------------

}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值