一.区别
1.用法上
- malloc是一个函数,而new是C++一个操作符
- malloc需要手动计算开辟的空间大小,new后面只需跟上空间的类型,如果有多个对象,加上[]给个数即可
- malloc申请的空间不能初始化,而new可以
- malloc返回void*,需要强制类型转换,而new返回对应类型的指针
- malloc失败会返回空指针,需要手动检查;new失败抛出异常,要用catch捕获
2.底层原理上
申请自定义类型对象时,malloc只会开辟空间,而new会先开辟空间,再去调用对象的构造函数完成初始化;delete会先调用对象的析构函数,再释放空间
二.联系
new是malloc的封装,delete是free的封装
对于自定义类型
new完成了两件事
- 开辟空间
- 调用构造函数
delete也同样:
- 调用析构函数
- 释放空间
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函数。