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的区别
原创
©著作权归作者所有:来自51CTO博客作者睿蕤芮的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
new thread 、 new stack和New Object的形象说明
e2 studio的使用
堆栈 Stack 网络协议栈 -
new与malloc的几点区别
C与C++中new与malloc的区别
C++ new malloc -
C++中new与malloc的区别
这是个老生常谈的问题。当时我回答new从自由存储区上
c++ 操作符 数组 -
new 与 malloc
1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存
delete destructor constructor 编译器 语言 -
new关键字与malloc的区别
new与malloc的区别……
new malloc -
(转载)new和malloc的区别
操作符,malloc是c 中的一个函数2、new 不止是分配内存,而且会调用
析构函数 构造函数 动态内存 -
globalalloc、malloc和new的区别动态内存 析构函数 构造函数 c++ 运算符