new/delete 和 malloc/free

2017年11月30日

今年九月份,我的一个忙于面试各大IT企业的舍友问了我一个问题:new和malloc有什么相同点和不同点。
我习惯于使用C++编程,也粗略看过C++primer这本书,但是掌握的知识点却是有限和分散的,工作意识薄弱的我没有对所学的知识进行系统地梳理和概括,当时的我向他请教了一番。昨天,马原课上,一位看着Android C++编程书籍的好友向我抛出了同样的问题:new和malloc有什么不同呢?我想是有必要整理成一篇博客,必要时供自己以及他人参考。

注:写这篇博客我的工作更多的是搬运和整理,我参考了stack overflow网友的答案,特此表示感谢

相同点
malloc和new都是用于动态内存申请的,free和delete都是用于动态内存撤销的。

不同点

  1. malloc和free配对使用,new和delete配对使用。

  2. malloc和free是C中的标准库函数,包含在stdlib.h头文件中,当然在C++中也能使用;new和delete是C++中的运算符,是在C++中提出的,因此不能在C中使用。

  3. 内存申请地不同。malloc allocates memory from ‘Heap’,即malloc是从堆中申请内存的;new allocates memory from ‘Free Store’,即new是从自由空间中申请内存的。

  4. 返回值不同。malloc returns a void* ,malloc是一个函数,函数原型是 void * malloc(size_t size),函数返回的是一个指向void类型的指针;new returns a fully typed pointer,new是一个操作符,返回的是指向一个完全类型(特定对象类型)的指针。

  5. 分配内存出错后返回的值可能不同。malloc如果申请内存失败的话会返回一个NULL(空指针),因此可以在程序中判断返回值是否等于NULL来确定内存是否分配成功;如果new申请内存失败的话,默认情况(比如写成“int *p = new int;”)会抛出一个类型为bad_alloc的异常,然而也可以改变使用new的方式来阻止其抛出异常,如写成“int *p = new (nothrow) int;”,这样的话如果申请内存失败则会返回一个NULL(空指针)。

  6. 所需大小声明不同。Must specify the size required in bytes when using malloc,使用malloc必须指明所需要分配空间的字节大小;Are called with Type-ID (compiler calculates the size) when using new,使用new时只需要申明类型就行了,字节大小由编译器自动计算。

  7. 对数组的处理不同。Allocating array requires manual calculation of space when using malloc,当使用malloc的时候需要人为指定所需空间的大小;Has a version explicitly to handle arrays when using new,new针对数组的内存申请有特殊的写法,比如“int *pia = new int[10];”返回指向第一个int的指针pia。

  8. 当重新分配更大的空间时表现不同。Reallocating larger chunk of memory simple (No copy constructor to worry about) when using malloc,使用malloc重新分配更大的内存空间是很简单,不需要考虑拷贝构造函数的影响(因为malloc是底层的,不涉及拷贝构造函数);Reallocating (to get more space) not handled intuitively (because of copy constructor) when using new,new则会由于拷贝构造函数的存在而不能直观处理。

  9. 调用关系不同。new/delete 有可能调用malloc/free函数,调不调用由接口定义,而malloc/free则不会调用new/delete,这很好理解。

  10. C++中new/delete 可以新增一个内存分配器来处理低可用内存(’set_new_handler’),而malloc/free则没办法处理底可用内存的情况。

  11. new/delete操作符可以被重载,而malloc/free不可以。

  12. new/delete创建/销毁对象时会调用类的构造函数/析构函数。

stack overflow 中还用到了一个比对的表格,在此将其贴上:

对照图

参考资料
1.stack overflow中的关于两者不同点的回答,链接如下:
https://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free

2.Primer c++书籍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值