new/delete 与 malloc/free

1 使用

  • m a l l o c 、 f r e e malloc、free mallocfree C C C 的标准库函数,需要引入库 stdlib.h 或者 malloc.h(malloc.h 与 alloc.h一致),函数原型为:

    void* malloc(size_t size) //参数代表字节个数
    void free(void* pointer) //参数代表内存地址
    
  • n e w new new d e l e t e delete delete 则为 C + + C++ C++ 的操作运算符,它调用的分别为赋值运算符重载 o p e r a t o r   n e w ( ) operator\ new() operator new() o p e r a t o r   d e l e t e ( ) operator\ delete() operator delete()


2 内存分配位置


3 开辟空间大小

  • m a l l o c malloc malloc 开辟空间类型大小需要手动计算,作为参数传递
  • n e w new new 是由编译器自动计算类型大小

4 异常检测

  • m a l l o c malloc malloc 开辟失败返回 N U L L NULL NULL ,导致空指针出现,需要对地址检查判空。
  • n e w new new 不需要判断,当分配内存失败时,会抛处 b a c _ a l l o c bac\_alloc bac_alloc 异常。

5 额外工作

  • m a l l o c / f r e e malloc/free malloc/free 函数只是开辟空间/释放空间。
  • n e w / d e l e t e new/delete new/delete 不仅负责开辟空间/回收空间,并调用构造函数/析构函数,进行初始化/清理工作。

  • n e w / d e l e t e new/delete new/delete 实现机制:
    在这里插入图片描述

  • n e w [ ] / d e l e t e [ ] new[]/delete[] new[]/delete[]实现机制:
    在这里插入图片描述
    如过程所示, n e w [ ] new[] new[] 会多开辟四个字节,用于存放对象的个数。返回地址时,会向后偏移四个从而指向数据首地址。

    d e l e t e [ ] delete[] delete[] 时,则会查看内存上对象的个数,从而根据个数count来确定调用几次析构函数,完成全部对象的清理内存工作。


6 扩充 / 缩小

  • m a l l o c malloc malloc 分配内存后,如果不够或者太多,可以使用 r e a l l o c ( ) realloc() realloc() 函数对其进行扩充或缩小。
  • n e w new new 分配好的内存不能直观简单的改变。

7 内存分配失败

  • n e w new new 分配内存失败,用户可以指定处理函数,或重新制定分配器。【 n e w _ h a n d l e r new\_handler new_handler 可以在此处进行扩展】
  • m a l l o c malloc malloc 分配失败,用户是不可以处理的。

8 释放判空检测

  • free 空指针会造成错误,必须判空。
  • 而delete遇到空指针,不会做任何事情,不需要额外判空。

  • 建议:无论是free还是delete,在释放之后,都习惯性的将指针置空,避免出现野指针或者悬垂指针。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值