美文网首页
C++之new和delete

C++之new和delete

作者: 二进制人类 | 来源:发表于2022-10-25 10:28 被阅读0次

    概述

    new是从堆区申请空间(作用等价于c语言:malloc calloc realloc)

    delete是释放堆区空间(作用等价于c语言:free)

    new和delete 操作的是基本类型的空间 和 malloc calloc realloc free 没有任何区别。

    new和delete 操作的是自定义类型的空间 只能使用 new和delete。

    new和delete操作基本类型空间

    //从堆区申请int类型的空间
    int *p1 = new int;
    *p1 = 100;
    cout<<"*p1 ="<<*p1<<endl;//100
    delete p1;
    
    //从堆区申请int类型的空间 并初始化为100
    int *p1 = new int(100);
    cout<<"*p1 ="<<*p1<<endl;//100
    delete p1;
    

    new和delete操作基本类型一维数组空间

    //需求:从堆区申请一个int数组 有5个元素
    //int *arr = new int[5]{10,20,30,40,50};
    int *arr = new int[5];
    int i=0;
    for(i=0;i<5;i++)
    {
        cout<<arr[i]<<" ";
    }
    cout<<endl;
    //注意:释放空间
    delete [] arr;//释放数组的所有元素空间
    //delete arr 只能释放第0个元素的空间
    

    new和delete操作基本类型二维数组空间

    //int (*arr)[4] = new int[3][4];
    int (*arr)[4] = new int[3][4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    int i=0;
    for(i=0;i<3;i++)
    {
        int j=0;
        for(j=0;j<4;j++)
        {
            cout<<arr[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<endl;
    
    delete [] arr;
    

    必须使用new和delete操作类的对象空间

    new 能申请空间 和 调用构造函数 malloc calloc 只能申请空间 不能调用构造函数。必须用new

    delete 能调用析构函数 和 释放空间 free只能释放空间。必须用delete.

    使用new和delete操作对象数组空间

    1.普通对象数组

    class A
    {
    public:
        int m_A;
    public:
        A()
        {
            m_A=0;
            cout<<"A无参构造 m_A="<<m_A<<endl;
        }
        A(int a)
        {
            m_A = a;
            cout<<"A有参构造 m_A="<<m_A<<endl;
        }
        ~A()
        {
            cout<<"A析构函数 m_A="<<m_A<<endl;
        }
    };
    
    void test(){
        //普通对象数组:每个元素为对象
        //创建对象数组的时候 每个元素都会调用构造函数
        //对象数组结束的时候 每个元素都会调用析构函数
        A arr[5];
    }
    

    2.普通对象数组初始化:每个元素必须显示调用构造函数初始化

    class A
    {
    private:
        int m_A;
        int m_B;
    public:
        A()
        {
            m_A=0;
            cout<<"A无参构造 m_A="<<m_A<<endl;
        }
        A(int a, int b)
        {
            m_A = a;
            m_B = b;
            cout<<"A有参构造 m_A="<<m_A<<", m_B="<<m_B<<endl;
        }
        ~A()
        {
            cout<<"A析构函数 m_A="<<m_A<<", m_B="<<m_B<<endl;
        }
        void showA()
        {
            cout<<"m_A="<<m_A<<", m_B="<<m_B<<endl;
        }
    };
    void test()
    {
        //普通对象数组:每个元素为对象 尽量显示调用有参构造进行元素的初始化
        //创建对象数组的时候 每个元素都会调用构造函数
        //对象数组结束的时候 每个元素都会调用析构函数
        A arr[5]={A(10,20),A(11,22),A(12,23),A(13,24),A(14,25)};
    
        int i=0;
        for(i=0;i<5;i++)
        {
            arr[i].showA();
        }
    }
    

    堆区对象数组

    class A
    {
    private:
        int m_A;
        int m_B;
    public:
        A()
        {
            m_A=0;
            cout<<"A无参构造 m_A="<<m_A<<endl;
        }
        A(int a, int b)
        {
            m_A = a;
            m_B = b;
            cout<<"A有参构造 m_A="<<m_A<<", m_B="<<m_B<<endl;
        }
        ~A()
        {
            cout<<"A析构函数 m_A="<<m_A<<", m_B="<<m_B<<endl;
        }
        void showA()
        {
            cout<<"m_A="<<m_A<<", m_B="<<m_B<<endl;
        }
    };
    void test()
    {
        A *arr = new A[5]{A(10,20),A(11,22),A(12,23),A(13,24),A(14,25)};
        int i=0;
        for(i=0;i<5;i++)
        {
            //arr[i].showA();
            //(*(arr+i)).showA();
            (arr+i)->showA();
        }
        delete [] arr;
    }
    

    new delete和malloc free的区别

    1、new不需要对申请的空间地址类型转换 malloc需要

    2、new数组空间的时候 delete释放数组空间需要加[] free不需要

    3、new 申请对象空间会调用构造函数 而malloc不会

    4、delete释放对象空间会调用析构函数 而free不会(建议C++中使用new和delete)

    delete不要释放void*指针,可能造成析构函数无法调用

    相关文章

      网友评论

          本文标题:C++之new和delete

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