new和malloc的区别
引言
看过很多C/C++的基础面经不难发现很多常考的问题,new和malloc的区别这一经典面试题,相信很多人都在面试中遇到过,但是很难答的全面,因此想有详细完整的答案,在查阅资料以及自我见解总结之后,今天我在这里整理了一下,以便日后复习使用。
一、两者实现原理(重要)
- new的实现原理:new的底层就是malloc,他会先调用malloc申请内存空间,然后再调用析构函数释放内存。
- malloc的实现原理:malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表的功能。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。这都是是为了减少内存碎片和系统调用的开销,malloc采用了内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内存块,以块作为内存管理的基本单位。同时malloc采用显示链表结构来管理所有空闲块,即使用一个双向链表将空闲链表连接起来,每一个空闲块记录了一个连续、未分配的地址。
当内存进行分配时,malloc会通过隐式链表遍历所有的空闲板块,选择满足要求的块进行分配,当进行内存合并时,malloc采用边界标记法,根据每个块前后块是否已经分配来决定是否进行块合并。
malloc在申请内存时,一般会通过brk或者mmap系统调用进行申请。其中当申请内存小于128K时,会使用系统函数brk在堆区中分配;而当申请内存大于128K时,会使用系统函数mmap在映射区分配。
二、两者区别(必看重重重点)
- 1.参数 使用new操作符申请内存分配时无需指定内存块的大小,编译器会根据其信息自行计算,且需要用户自己初始化。而malloc则需要显示地指出所需内存的大小,会自行初始化。
- 2.属性 new/delete是C++的关键字,需要编译器支持。 malloc/free是库函数,需要头文件的支持。
- 3.返回类型 new操作符内存分配成功时,返回的类型是指针,类型严格与对象匹配,无需转换,所以new是符合类型的安全操作符。
而malloc返回的是void*,需要通过强制类型转换,强void*转换成我们需要的类型。

本文详细探讨了C/C++中new和malloc的区别,包括其实现原理、参数使用、返回类型、重载特性、自定义类型处理、分配失败处理、数组处理及内存区域差异。通过对比,读者能更深刻理解两者在内存管理上的不同。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



