1.申请的内存所在的位置
new操作符从自由存储区上为对象动态分配内存空间,malloc从堆上动态分配内存。
自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行进行内存申请,该内存即为自由存储区。而堆是操作系统所维护的一块特殊内存,用于程序的动态分配。C语言使用malloc从堆上分配内存,使用free释放已分配的内存。
而自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。
2.返回类型的安全性
new 内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,所以new是符合类型安全性的操作符。
malloc 内存分配成功则是返回void*,需要通过强制类型转换将void*指针转换成我们需要的类型。
3.内存分配失败时的返回值
new内存分配失败时,回抛出bac_alloc异常,不会返回NULL,malloc内存分配失败时,会返回NULL.
4.是否需要指定内存大小
使用new操作符申请内存分配时无需指定内存块的大小,编译器会根据类型信息进行自动计算,而malloc则需要显式的指出所需内存的大小。
5.是否调用构造函数和析构函数
使用new操作符来分配对象内存时会经历三个步骤:
(1)调用operator new 函数(数组operator new [])分配一块足够大的,原始的未命名的内存空间以便存储特定类型的对象。
(2)编译器调用构造函数进行初始化;
(3)对象构造完成后,返回一个指向该对象的指针。
使用delete操作符来释放对象内存时会经历两个步骤:
(1)调用对象的析构函数
(2)编译器调用operator delete(或operator delete[])函数释放空间。
6.对数组的处理
C++提供了new[]与delete[]来专门处理数组类型。
new对数组的支持体现在它会分别调用构造函数初始化数组的每一个元素,释放对象时为每个元素调用析构函数。
至于malloc,它并不知道你在这块内存上刚的是数组还是其它东西。反正就是给你一块原始的内存,再给一个内存的地址就完事了。
7.new与malloc是否可以互相调用
operator new/operator delete的实现基于malloc和free,而malloc和free的实现不可以调用new和delete。
8.是否可以被重载
operator new和operator delete可以被重载,malloc和free不可以被重载。
9.能否直观的重新分配内存
使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配,实现内存扩充。new没有这样的配套设施来扩充内存。
10.客户处理内存分配不足
在operator new 抛出异常以反映一个未获得满足的需求之前,它会先调用一个用户指定的错误处理函数new-handler,
对于malloc,客户并不能够去编程决定内存不足以分配时要干什么事情,只能看着malloc返回NULL.
文章名称:new与malloc的区别
地址分享:
http://bjjierui.cn/article/jsesoo.html