new 和 malloc 区别

new 和 malloc 区别,第1张

概述1、申请内存的位置 new从自由存储区为对象分配内存,malloc从堆上分配。 自由存储区是C++基于new *** 作符的一个抽象概念,凡是通过new *** 作符进行内存申请,该内存即为自由存储区。而堆是 *** 作系统中的术语,是 *** 作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。 自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配

1、申请内存的位置

new从自由存储区为对象分配内存,malloc从堆上分配。

自由存储区是C++基于new *** 作符的一个抽象概念,凡是通过new *** 作符进行内存申请,该内存即为自由存储区。而堆是 *** 作系统中的术语,是 *** 作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。

自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存),这取决于operator new 的实现细节。自由存储区不仅可以是堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

2、返回类型安全性

new *** 作符分配成功,返回对象类型指针,不用类型转换;

malloc分配成功,返回voID*,需要强制类型转换成对象类型指针;

3、分配失败

new失败,抛出异常,不返回NulL;

malloc失败,返回NulL;

4、指定内存大小

new不需要;

mallco需要显示指定(sizeof(type)*n);

5、调用构造函数、析构函数

new:调用operator new分配足够大的内存,运行构造函数,返回对象指针

delete:调用对象的析构函数,调用operator delete释放空间

而malloc不会

 

总结:

特征 new/delete malloc/free
分配内存的位置 自由存储区
内存分配成功返回值 完整类型指针 voID*
内存分配失败返回值 默认抛出异常 返回NulL
分配内存的大小 由编译器根据类型计算得出 必须显式指定字节数
处理数组 有处理数组的new版本new[] 需要用户计算数组的大小后进行内存分配
已分配内存的扩充 无法直观地处理 使用realloc简单完成
是否相互调用 可以,看具体的operator new/delete实现 不可调用new
分配内存时内存不足 客户能够指定处理函数或重新制定分配器 无法通过用户代码进行处理
函数重载 允许 不允许
构造函数与析构函数 调用 不调用
总结

以上是内存溢出为你收集整理的new 和 malloc 区别全部内容,希望文章能够帮你解决new 和 malloc 区别所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1228638.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存