56.malloc与free的实现原理?
1.在标准C库中,提供了malloc/free函数分配释放内存,这两个函数底层是由brk、mmap、,munmap这些系统调用实现的;
2.brk是将数据段(.data)的最高地址指针_edata往高地址推,mmap是在进程的虚拟地址空间中(堆和栈中间,称为文件映射区域的地方)找一块空闲的虚拟内存。这两种方式分配的都是虚拟内存,没有分配物理内存。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系;
3.malloc小于128k的内存,使用brk分配内存,将_edata往高地址推;malloc大于128k的内存,使用mmap分配内存,在堆和栈之间找一块空闲内存分配;brk分配的内存需要等到高地址内存释放以后才能释放,而mmap分配的内存可以单独释放。当最高地址空间的空闲内存超过128K(可由M_TRIM_THRESHOLD选项调节)时,执行内存紧缩操作(trim)。在上一个步骤free的时候,发现最高地址空闲内存超过128K,于是内存紧缩。
4.malloc是从堆里面申请内存,也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
malloc与free是C/C++中常用的内存分配和释放函数,他们的使用详情如下:
1.malloc(malloc函数)
malloc函数的作用是在内存中分配一块指定大小的连续空间,并将其作为结构体或数组的一部分。其实现原理如下:
(1)首先确定要分配的内存大小,即size。
(2)然后在内存中搜索一个足够大的连续空间,并将其作为结构体或数组的一部分使用。如果内存不足,则分配失败,返回NULL。
(3)如果分配成功,则将新的结构体或数组的地址存储在malloc函数的返回值中,并对其进行初始化。
(4)最后,释放已分配的内存,即调用free函数将结构体或数组的地址从内存中删除。
2.free(free函数)
free函数的作用是释放已经分配的内存空间,并将其从内存中删除。其实现原理如下:
(1)首先记录要释放的内存的起始地址和大小。
(2)然后调用malloc函数将同样大小的内存区域分配给该结构体或数组。
(3)最后,将释放前的结构体或数组的地址赋值给free函数的参数,即可完成内存释放。
需要注意的是,malloc和free函数都是C/C++中的标准库函数,在不同的编程环境和内核中,可能会有不同的实现细节和参数。
malloc和free的使用方法非常简单,可以参考以下示例代码:
使用malloc函数分配内存:
int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL)
{
// 分配失败,处理错误
}
使用free函数释放内存:
int* p = (int*)malloc(10 * sizeof(int));
if (p != NULL)
{
free(p); // 释放内存
}
在使用完malloc分配的内存后,需要使用free函数将其释放,否则会导致内存泄漏,即在程序运行结束后,仍然有内存区域未被释放。这会导致系统内存不足,甚至会导致程序崩溃。
参考资料来源:
阿秀
标签:malloc,函数,56,释放,free,内存,分配 From: https://www.cnblogs.com/codemagiciant/p/17525561.html