C++中new与delete问题学习

本文深入探讨了C++中new与delete的使用,包括char与int类型的内存分配与释放,详细解释了内存泄露的问题,并提供了正确的代码示例。同时,文章还总结了new与delete的正确使用方法,避免常见的编程陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++newdelete问题学习

一.new chardelete问题

1. 问题程序

[cpp]  view plain copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. void main()  
  6.   
  7. {         
  8.   
  9. char* des = new char();  
  10.   
  11. des = "testing!";  
  12.   
  13. cout<<des<<endl;  
  14.   
  15.   
  16.   
  17. delete des;  //这个delete需要吗  
  18.   
  19.   
  20.   
  21. }  

 

2. 错误

       当运行到delete时,程序出错!

 

3. 解答

v1

你用new申请了一个char空间,把它的地址保存在了des这个指针里面

然后你又把"testing!"这个常量字符串的地址赋给了des这个指针

于是,你之前用new申请的那个空间就丢失了,在程序结束系统回收全部内存前,那个空间就被标明被你使用但实际上你已经丢失它的地址没办法再使用它了,这就是最常见的内存泄露

delete出错理所当然,因为你delete的不是你new的那个空间。甲被乙骗了钱不能去法院起诉丙,丙是无辜的 

 

v2

1.

char* des = new char();

应该只分配一个byte的空间,而后面的des = "testing!";我猜楼主的意图是要将"testing!"放入des所指向的空间,很显然实际上是放不下去的。之所以输出有没有问题,是刚好将"testing"的首地址给了des,这就改变des的值,也就是des = "testing!"中的des,和前面的char* des = new char();已经不同了。

 

4. 正确代码

V1

[cpp]  view plain copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5.    
  6.   
  7. void main()  
  8.   
  9. {  
  10.   
  11.        char* des = new char[10];  
  12.   
  13.        memset(des, 0, 10);  
  14.   
  15.        strcpy(des, "testing!");  
  16.   
  17.        cout << des << endl;  
  18.   
  19.    
  20.   
  21.        delete des;  
  22.   
  23. }  
  24.   
  25.    

 

V2 严格版

 

[cpp]  view plain copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5.    
  6.   
  7. void main()  
  8.   
  9. {  
  10.   
  11.     char* des = new char[10];  
  12.   
  13.     memset(des, 0, 10);  
  14.   
  15.     strcpy(des, "testing!");  
  16.   
  17.     cout << des << endl;  
  18.   
  19.    
  20.   
  21.     delete[] des; // new[]和delete[]对应。但由于char是基本数据类型,所以6楼那样写应该也是没有问题的  
  22.   
  23. }  
  24.   
  25.    


 

二.new intdelete

1. 程序

[cpp]  view plain copy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5.    
  6.   
  7. void main()  
  8.   
  9. {  
  10.   
  11. //一维整型指针  
  12.   
  13.        int *a = new int [2];  
  14.   
  15.        for (int i=0;i<2;i++)  
  16.   
  17.        {  
  18.   
  19.               a[i] = 1;  
  20.   
  21.        }  
  22.   
  23.    
  24.   
  25.        for (int i=0;i<2;i++)  
  26.   
  27.        {  
  28.   
  29.               printf("%d \n",a[i]);  
  30.   
  31.        }  
  32.   
  33.    
  34.   
  35.        delete[] a;  
  36.   
  37.    
  38.   
  39. //二维整型指针  
  40.   
  41.        int **b = new int *[2];  
  42.   
  43.        for (int i=0;i<2;i++)  
  44.   
  45.        {  
  46.   
  47.               b[i] = new int [2];  
  48.   
  49.        }  
  50.   
  51.        for (int i=0;i<2;i++)  
  52.   
  53.        {  
  54.   
  55.               for (int j=0;j<2;j++)  
  56.   
  57.               {  
  58.   
  59.                      b[i][j] = 2;  
  60.   
  61.               }  
  62.   
  63.        }  
  64.   
  65.    
  66.   
  67.        for (int i=0;i<2;i++)  
  68.   
  69.        {  
  70.   
  71.               for (int j=0;j<2;j++)  
  72.   
  73.               {  
  74.   
  75.                      printf("%d ",b[i][j]);  
  76.   
  77.               }  
  78.   
  79.               printf("\n");  
  80.   
  81.        }  
  82.   
  83.          
  84.   
  85.        for (int i=0;i<2;i++)  
  86.   
  87.        {  
  88.   
  89.               delete[] b[i];  
  90.   
  91.        }  
  92.   
  93.        delete[] b;  
  94.   
  95.    
  96.   
  97.        system("pause");  
  98.   
  99. }  
  100.   
  101.    

 

2. 程序运行正常

       char以外的基本数据类型,在进行指针释放时一般不用考虑太多,主要是因为没有字符串的赋值(实质是地址的赋值)。

               

三.小结

       new的类型中,涉及到地址赋值,要千万小心!

四、使用陷阱

new和delete成对使用,避免内存泄露,申请内存数组时使用的"[]"而非“()”。如下:

char * szData=new char(100); (错误)

char *szData=new char[100];(正确)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值