C++:new与malloc的区别

只谈情不闲聊 提交于 2020-03-29 18:07:31

 

1.属性

new/delete是操作符,是C++关键字,需要编译器支持;malloc/free是库函数,需要头文件支持。

2.参数

使用new操作符动态分配内存时无需指定内存块大小,编译器会根据类型自行计算;malloc分配内存时需要显式地指出所需内存块大小。

3.返回类型

new操作符内存分配成功时会返回相应对象类型的指针,无需进行强制类型转换,符合类型安全性,分配失败时会抛出bac_alloc异常;malloc分配内存成功时会返回void*类型的指针,需要通过强制类型转换为所需类型,分配失败时返回NULL值。

4.非内部数据对象

new会先调用operator new函数,申请足够的内存,再调用类型的构造函数,初始化成员变量,最后返回自定义类型的指针;delete会先调用析构函数,然后调用operator delete函数释放内存;malloc/free是库函数,只能动态申请内存及释放内存,无法完成构造函数及析构函数的工作。

5.重载

C++允许重载new/delete(实际上是重载operator new 和operator delete),特别的,布局new(placement new)就不需要为对象分配内存,而是使用指定一个地址作为内存起始区域,new在这段内存上完成对象的构造函数调用并初始化该内存段,并返回此内存地址;malloc/free不允许重载。

6.内存区域

new操作符从自由存储区(free stone)上为对象动态分配空间,malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请的,该内存即为自由存储区;堆是操作系统中已分配的对应的内存区域。自由存储区不等于堆,布局new就可以不位于堆中。堆是一个实际的区域,而自由存储区是一个更上层的概念。通常new确实是在堆上申请内存,但是程序员可以自己重载new操作符,使用其他内存来实现自由存储(不常见),另外,C++primer plus这本书上提到的布局new,可以为对象在栈上分配内存。总的来说,自由存储区是new申请的区间的概念。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!