zoukankan      html  css  js  c++  java
  • C++中new与delete问题学习

    一.new char与delete问题
    1. 问题程序
    [cpp] view plaincopy 
    #include <iostream>  
      
    using namespace std;  
      
    void main()  
      
    {         
      
    char* des = new char();  
      
    des = "testing!";  
      
    cout<<des<<endl;  
      
      
      
    delete des;  //这个delete需要吗  
      
      
      
    }  
     
    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 plaincopy 
    #include <iostream>  
      
    using namespace std;  
      
       
      
    void main()  
      
    {  
      
           char* des = new char[10];  
      
           memset(des, 0, 10);  
      
           strcpy(des, "testing!");  
      
           cout << des << endl;  
      
       
      
           delete des;  
      
    }  
      
       
     
    V2 严格版
     
    [cpp] view plaincopy 
    #include <iostream>  
      
    using namespace std;  
      
       
      
    void main()  
      
    {  
      
        char* des = new char[10];  
      
        memset(des, 0, 10);  
      
        strcpy(des, "testing!");  
      
        cout << des << endl;  
      
       
      
        delete[] des; // new[]和delete[]对应。但由于char是基本数据类型,所以6楼那样写应该也是没有问题的  
      
    }  
      
       
    
     
    二.new int与delete
    1. 程序
    [cpp] view plaincopy 
    #include <iostream>  
      
    using namespace std;  
      
       
      
    void main()  
      
    {  
      
    //一维整型指针  
      
           int *a = new int [2];  
      
           for (int i=0;i<2;i++)  
      
           {  
      
                  a[i] = 1;  
      
           }  
      
       
      
           for (int i=0;i<2;i++)  
      
           {  
      
                  printf("%d 
    ",a[i]);  
      
           }  
      
       
      
           delete[] a;  
      
       
      
    //二维整型指针  
      
           int **b = new int *[2];  
      
           for (int i=0;i<2;i++)  
      
           {  
      
                  b[i] = new int [2];  
      
           }  
      
           for (int i=0;i<2;i++)  
      
           {  
      
                  for (int j=0;j<2;j++)  
      
                  {  
      
                         b[i][j] = 2;  
      
                  }  
      
           }  
      
       
      
           for (int i=0;i<2;i++)  
      
           {  
      
                  for (int j=0;j<2;j++)  
      
                  {  
      
                         printf("%d ",b[i][j]);  
      
                  }  
      
                  printf("
    ");  
      
           }  
      
             
      
           for (int i=0;i<2;i++)  
      
           {  
      
                  delete[] b[i];  
      
           }  
      
           delete[] b;  
      
       
      
           system("pause");  
      
    }  
      
       
     
    2. 程序运行正常
           除char以外的基本数据类型,在进行指针释放时一般不用考虑太多,主要是因为没有字符串的赋值(实质是地址的赋值)。
                   
    三.小结
           在new的类型中,涉及到地址赋值,要千万小心!
    四、使用陷阱
    new和delete成对使用,避免内存泄露,申请内存数组时使用的"[]"而非“()”。如下:
    char * szData=new char(100); (错误)
    char *szData=new char[100];(正确)
        int**a = new int*[2];
        for(int i=0;i<2;i++){
            *(a+i) = new int[3];    //a[i] = new int[3];
            for(int j=0;j<3;j++){
                *(*(a+i)+j) = j;    //a[i][j] = j;  
            }
        }
        for(int i=0;i<2;i++){
            for(int j=0;j<3;j++){
                cout<<"a["<<i<<"]["<<j<<"]="<<*(*(a+i)+j)<<endl;
            }
            cout<<endl;
        }
  • 相关阅读:
    数字精确运算BigDecimal经常用法
    C3P0数据库连接池使用
    Theano学习笔记(四)——导数
    Leetcode--Merge Intervals
    1191 数轴染色
    P1021 邮票面值设计
    P1032 字串变换
    P1294 高手去散步
    P1832 A+B Problem(再升级)
    P1332 血色先锋队
  • 原文地址:https://www.cnblogs.com/yaowen/p/4803113.html
Copyright © 2011-2022 走看看