malloc和new的区别及联系

一.区别

1.用法上

  1. malloc是一个函数,而new是C++一个操作符
  2. malloc需要手动计算开辟的空间大小,new后面只需跟上空间的类型,如果有多个对象,加上[]给个数即可
  3. malloc申请的空间不能初始化,而new可以
  4. malloc返回void*,需要强制类型转换,而new返回对应类型的指针
  5. malloc失败会返回空指针,需要手动检查;new失败抛出异常,要用catch捕获

2.底层原理上

申请自定义类型对象时,malloc只会开辟空间,而new会先开辟空间,再去调用对象的构造函数完成初始化;delete会先调用对象的析构函数,再释放空间

二.联系

new是malloc的封装,delete是free的封装

对于自定义类型

new完成了两件事

  1. 开辟空间
  2. 调用构造函数

delete也同样:

  1. 调用析构函数
  2. 释放空间

new由两部分组成:operator new函数和构造函数

delete由两部分组成:operator delete函数和析构函数

其中operator new和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

有了malloc,为什么还要写一个operator new函数呢?事实上,operator new和malloc的用法和功能一模一样,也是手动计算空间大小,返回值需要强制类型转换。但是如果开辟空间失败,它会抛出异常。所以设计operator new的意义就是能抛出异常。

为了和operator new对称,所以又设计了一个operator delete,它其实也是封装了free函数。

malloc和new的区别及联系_第1张图片

 

你可能感兴趣的:(数据结构)