加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

new 和 malloc 区别

发布时间:2020-12-16 07:19:05 所属栏目:百科 来源:网络整理
导读:1、申请内存的位置 new从自由存储区为对象分配内存,malloc从堆上分配。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过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
分配内存时内存不足 客户能够指定处理函数或重新制定分配器 无法通过用户代码进行处理
函数重载 允许 不允许
构造函数与析构函数 调用 不调用

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读