new/delete(常规new)

一、C的动态内存管理

malloc、calloc、realloc

int main()
{
    int n=10;
    //void* malloc(size_t size);分配size字节的未初始化内存
    int *ipa = (int*)malloc(sizeof(int)*n);

    //void *calloc(size_t num,size_t size);
    //为num个size大小的对象的数组分配内存,并将分配存储中的所有字节初始化为零
    int *ipb =(int*)calloc(n,sizeof(int));

    //void *realloc(void *ptr,size_t new_size);
    //重新分配给定的内存区域(扩容)
    ipa=(int *)realloc(ipa,szieof(int)*n*2);

    free(ipa);//释放都使用free
    ipa=NULL;
    free(ipb);
    ipb=NULL;
    return 0;
    

}

二、c++的动态内存管理

1.new运算符的使用

new首先开辟内存空间,其次调动缺省构造函数。 

int main()
{
    int n=10;
    // 1.计算sizeof(int) 2.malloc 3.初始化为10 4.将申请的空间给ipa
    int *ipa=new int(10);     //int *ipa=10;
    // 1.计算sizeof(int)*n 2.malloc 3.将第一个初始化为10,其余为0 4.申请的空间给ipb
    int *ipb=new int[n](10);
    int *ipc=new int[n]{1,2,3,4,5,6,7};

    delete ipa;//注意:free和delete之后,必须将指针置空
    delete[]ipb;
    delete[]ipc;
    reeturn 0;
    //用new申请之后,释放用delete
}

2.new的函数方式的使用

int main()
{
    int n=10;
    //以函数形式调用new,只是申请空间,不进行初始化
    int *ipa=(int*)::operator new(sizeof(int));
    //       (int*)malloc(szieof(int)) 内存不足时,申请失败,返回空
    int *ipb=(int*)::operator new(sizeof(int)*n);
    //       (int*)malloc(sizeof(int)*n);

    ::operator delete(ipa);
    ::operator delete(ipb);
    return 0;
}

new和operator new在内存不足时,申请失败,抛出异常,(std::bad_alloc)

对于new来说判空无意义,而malloc有意义

int *ipa=new(std::nothrow)int(10);//不要抛出异常,申请失败为0

三、定位new

int main()
{
    int n=10;
    int *ipa=(int*)malloc(sizeof(int));
    int *ipb=(int*)::operator new(sizeof(int)*n);

    new(ipa) int(20);    //new(ipa) int{20}两种写法等价
    new(ipb) int[]{1,2,3,4,5,6,7,8,9};

    free(ipa);
    ::operator delete(ipb);
    return 0;
}

定位new只要有合法的空间,就可以将任意类型给进去

四、new、malloc区别

1.new/delete是c++中的运算符。malloc/free是函数api;

2.malloc申请内存空间时,手动计算所需大小,new只需类型名,自动计算大小;

3.malloc申请的内存空间不会初始化,new可以初始化;

4.malloc的返回值为void*,接收时必须强转,new不需要;

5.malloc申请内存空间失败时,返回的是NULL,使用时必须判空;

6.new申请内存空间失败时抛出异常,所以要有捕获异常处理程序;

五、free和delete的区别

        free对应的是malloc,delete对应的是new,free用来释放malloc的对应内存空间,delete释放的是new的对应内存空间。

        在对象中, free的确释放了对象的内存,但是不调用对象的析构函数,所以如果在对象中使用new分配的内存就会泄露, delete不仅释放对象的内存,并且调用对象的析构函数!

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值