网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

new与malloc的区别

  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

其他资讯