malloc函数的复杂性导致直接分析源码比较困难,但是我们可以关注一下过程。首先,了解Malloch分配的内存结构很重要。当我们使用malloc时,分配的内存不仅仅是用户请求的内存量,还带有管理头和尾部。
在内存分配示例中,用户指定0x100字节,实际分配的填充空间包括系统配置的cookie和填充空间。填充区域上方和下方都有空格,用于区分可用内存和不可用内存以及返回时越界。修正由上部空间的7个连续位置组成。
在进入程序之前,系统会创建一个堆空间来管理内存,并通过__cdecl_heap_init函数构建一个包含16个HEADER节点的链表,每个节点控制1MB内存。每个节点将1MB划分为32个32KB段,并保存一个代表尚未分配的虚拟地址的pHeapData指针。
再深入一点,在pRegion表示的标记区域结构中,每个内存段(组)有8个4KB的内存页,可用的内存被加载到一个链表中。分配时,从附加的内存列表中查找,如果没有找到,则扩展到其他连接的列表中。返回时,通过比较地址范围来确定组成员,并通过合并空闲内存和更新分配时间来进行操作。
如果一个Group被完全回收,它不会立即返回到系统,而是等待其他Group被重用后再合并和释放。这消除了与操作系统的冗余交互并提高了效率。
mallok和new的区别有四点:请求的内存位置、返回类型的安全性、内存分配失败时的返回值、是否需要指定内存大小。
1.请求的内存位置不同
新的处理程序从空闲存储区域(freestore)动态为对象分配内存空间。空闲存储区域是C++中基于new运算符的抽象概念每当通过new运算符创建内存申请时,内存就是空闲存储区域。
malloc函数从堆中动态分配内存。堆是操作系统中的一个术语,它是操作系统维护的一种特殊内存,用于动态内存分配C语言程序使用malloc从堆中分配内存,使用free释放分配的相应内存。
2.返回类型安全性不同
当new运算符内存分配成功时,返回一个对象类型指针,且类型与对象实际匹配,不需要进行类型转换,因此new是一个类型安全运算符。
如果malloc内存分配成功,会返回void*。void*指针需要通过强制类型转换转换为我们需要的类型。
3.内存分配失败时的返回值不同
当新的内存分配失败时,会抛出bac_alloc异常,并且不会返回NULL。
malloc分配内存失败时返回NULL。
4.是否需要指定不同的内存大小?
使用new运算符申请内存分配时,不需要指定内存块大小,编译器会根据类型信息自动计算。
malloc需要显式声明所需的内存大小。
参考资料:—malloc和new的区别
上一篇:malloc内存分配在哪里
下一篇:c语言动态分配内存malloc