美文网首页Coding
c++ new 和delete的种种

c++ new 和delete的种种

作者: e26f55e7ec23 | 来源:发表于2020-02-19 21:19 被阅读0次

    new/delete动态管理对象,new[]/delete[]动态管理对象数组。

    图片.png

    C++中,把int 、char..等内置类型的变量也看作对象,它们也是存在构造函数和析构函数的,只是通常对它们,系统调用了默认的构造函数来初始化以及默认的析构(编译器优化)。所以new int、new int(3)看起来和普通的定义好像没什么区别。
    但对于自定义类型的对象,此种方式在创建对象的同时,还会将对象初始化好;于是new/delete、new []/delete []方式管理内存相对于malloc/free的方式管理的优势就体现出来了,因为它们能保证对象一被创建出来便被初始化,出了作用域便被自动清理。

    malloc/free和new/delete的区别和联系

    • malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理(清理成员)。

    • 它们都是动态管理内存的入口。

    • malloc/free是C/C++标准库的函数,new/delete是C++操作符。

    • malloc/free需要手动计算类型大小且返回值w为void*,new/delete可自动计算类型的大小,返回对应类型的指针。

    • malloc/free管理内存失败会返回0,new/delete等的方式管理内存失败会抛出异常。

    #include<iostream> 
    #include<cstring>
    
    using namespace std;
    
        
    int main()
    {
        char * pia = new char[10];
        int * pi = new int[10];
        
        memset(pia,0,10*sizeof(pia));
        memset(pi,0,10*sizeof(pi));
    //  for(int i = 0;i < 10; i++ )
    //  {
    //      *s1[i] = i;
    //      cout << i << ":" <<s1[i] << endl;
    //  }
        
        *(pia+3) = 99;
        *(pi+3) = 99;
        pi[2] = 12;
        
        for(int j = 0;j < 10; j++ )
        {
            cout << j << ":" << *(pia+j)<< endl;
        }
        
        cout << "------------" << endl;
        
        for(int j = 0;j < 10; j++ )
        {
            cout << j << ":" << *(pi+j)<< endl;
        }
        
        cout << "------------" << endl;
        
        delete [] pia;
        delete [] pi;
        
        return 0;
    }
    }
    

    out:

    0:
    1:
    2:
    3:c
    4:
    5:
    6:
    7:
    8:
    9:
    10:
    ------------
    0:0
    1:0
    2:12
    3:99
    4:0
    5:0
    6:0
    7:0
    8:0
    9:0
    ------------
    

    一个小练习:

    1.new 一个char数组
    2.全赋0x00
    3.通过iostream的cin赋值
    4.全部转换为大写
    5.删除数组

    #include<iostream>
    #include<cstring>
    
    using namespace std;
    
    int main()
    {
        char * num = new char[10];
        char temp;
        
        memset(num,0,10*sizeof(char));
        
        for(int i = 0;i < 10; i++)
        {
            cout << "num[" << i << "]:" << *(num+i) << endl;
    //      cout << "num[" << i << "]:" << num[i] << endl;//两种访问方法
        }
            
        for(int j = 0;j < 10; j++)
        {
            cout << "num[" << j << "]:" ;
            cin >> temp;
            if(temp < 0)
            break;
            //cout << endl;
            *(num+j) = temp;
        }
        cout << "----------------" << endl;
        for(int i = 0;i < 10; i++)
        {
            cout << "num[" << i << "]:" << *(num+i) << endl;
    //      cout << "num[" << i << "]:" << num[i] << endl;
        }
        
        for(int i = 0;i < 10; i++)
        {
            if ((*(num+i) >= 65)&&(*(num+i) <= 90))
                continue;
            else
                *(num+i) -= 32;
        }
        
        for(int i = 0;i < 10; i++)
        {
            cout << "num[" << i << "]:" << *(num+i) << endl;
        }
        
        delete[] num;
        return 0;
    }
    

    不错的链接:
    new二维数组:https://blog.csdn.net/u012234115/article/details/36686457
    动态分配:https://blog.csdn.net/shanzhizi/article/details/7835752?utm_source=distribute.pc_relevant.none-task
    new/delete&new[]/delete[]:https://www.cnblogs.com/hazir/p/new_and_delete.html

    相关文章

      网友评论

        本文标题:c++ new 和delete的种种

        本文链接:https://www.haomeiwen.com/subject/sgbofhtx.html