C++杂讲 new和delete

目录

知识点1 【new为基本类型 申请堆区空间】

 知识点2 【new为基本类型数组 申请堆区空间】

注意:

 知识点3 【new申请自定义数据类型】(结构体、类型对象)

 知识点4 【c++中申请堆区空间】

(1)、给对象申请空间需要做的事情

(2)、释放对象空间需要做的事情

知识点5 【对象数组】

(1)、本质是数组 只是数组的每个元素是类的对象

(2)、如果想让对象数组中的元素调用有参构造 必须人为使用 有参构造初始化。

(3)、用new delete申请 对象数组

 知识点6 【delete不能作用void *修饰的对象指针】

 知识点7 【malloc、free和new、delete 不可以混搭使用】

new从堆区申请, delete释放堆区空间

知识点1 【new为基本类型 申请堆区空间】

void test01()
{
    //1、 申请空间
    int *p = NULL;
    p = new int;//申请空间
    *p = 100;
    cout<<"*p = "<<*p<<endl;//100
    delete p;//释放空间

    //2、申请空间 并赋值
    p = new int(10);//申请空间 并赋值为10
    cout<<"*p = "<<*p<<endl;//10
    delete p;//释放空间
}

 知识点2 【new为基本类型数组 申请堆区空间】

注意:

        new 没有加[] delete释放的时候 就不加[]

        new 加[] delete释放的时候 就加[]

void test02()
{
    int n = 5;
    int *arr = NULL;
    //申请基本类型数组类型
    arr = new int[n]{10,20,30,40,50};

    int i=0;
    for(i=0;i<n;i++)
    {
        cout<<arr[i]<<" ";
    }
    cout<<endl;

    //释放空间
    delete [] arr;
}

 知识点3 【new申请自定义数据类型】(结构体、类型对象)

class Data
{
public:
    int m_a;
    int m_b;
public:
    Data()
    {
        m_a = 0;
        cout<<"Data无参构造 m_a = "<<m_a<<endl;
    }
    Data(int a, int b)
    {
        m_a = a;
        m_b = b;
        cout<<"Data有参构造 m_a = "<<m_a<<endl;
    }
    ~Data()
    {
        cout<<"析够函数m_a = "<<m_a<<endl;
    }
};
void test03()
{
    //1、申请Data对象
    Data *p = new Data;//调用无参构造
    delete p;

    p = new Data(10,20);//调用有参构造
    delete p;

    //2、申请Data数组
    //对象数组 每个元素 都会调用构造函数
    //Data *arr = new Data[5]{{11,12},{21,22},{31,32},{41,42},{51,52}};
    Data *arr = new Data[5]{Data(11,12),Data(21,22),Data(31,32),Data(41,42),Data(51,52)};
    //如果delete不加[]只能释放数组的第0个元素
    delete [] arr;
}

 知识点4 【c++中申请堆区空间】

建议使用new、delete 而不是malloc,calloc,realloc和free

(1)、给对象申请空间需要做的事情

        申请堆区空间(malloc,calloc,realloc) (new)

        调用构造函数(new)

(2)、释放对象空间需要做的事情

        调用析够函数(delete)

        释放堆区空间(delete) (free)

总结:

        new能申请空间调用构造函数,而malloc,calloc只能申请空间, delete会调用析够函数释放空间,而free只能释放空间

知识点5 【对象数组】

(1)、本质是数组 只是数组的每个元素是类的对象

运行结果: 

 

(2)、如果想让对象数组中的元素调用有参构造 必须人为使用 有参构造初始化。

void test07()
{
    //对象数组 arr1是数组 每个元素是Person类型的对象
    //定义对象数组的时候 系统会自动给 数组中的每个元素 调用构造函数
    //人为 为元素 调用有参构造
    //初始化部分 调用有参构造 未初始化部分自动调用默认构造(无参构造)
    Person arr1[5]={ Person("lucy",18), Person("bob",20)};
    //arr1[0] 第0个元素 就是Person的对象
    arr1[0].showPerson();
    arr1[1].showPerson();
}

运行结果:

(3)、用new delete申请 对象数组

void test08()
{
    //第一种方式
    Person *arr = NULL;
    arr = new Person[5];//调用无参构造

    delete [] arr;

    //第二种方式:
    //初始化的元素 调用有参构造 没有初始化 的调用无参构造
    Person *arr2 = new Person[5]{Person("lucy",18), Person("bob",20)};
    (*(arr2+0)).showPerson();
    arr2[0].showPerson();
    (arr2+1)->showPerson();
    delete [] arr2;
}

 知识点6 【delete不能作用void *修饰的对象指针】

 尽量不要用delete释放void *

 注意:没有析构?为哈?

delete发现p1指向的类型 为void 无法从void中寻找响应析构函数

 知识点7 【malloc、free和new、delete 不可以混搭使用】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值