首页 > 其他分享 >56.malloc与free的实现原理?

56.malloc与free的实现原理?

时间:2023-07-04 14:00:27浏览次数:28  
标签:malloc 函数 56 释放 free 内存 分配

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

相关文章

  • 55.malloc申请的存储空间能用delete释放吗?
    55.malloc申请的存储空间能用delete释放吗?不能,malloc/free主要为了兼容C,new和delete完全可以取代malloc/free的。malloc/free的操作对象都是必须明确大小的,而且不能用在动态类上。new和delete会自动进行类型检查和大小,malloc/free不能执行构造函数与析构函数,所以动态对象......
  • g2o运行报错double free or corruption (out)
    问题项目中调用了g2o,编译没有问题,但是运行的时候报错了,报错的位置是g2o的SparseOptimizer类的析构函数里调用的clear()函数.明明上一个项目运行过程中没遇到这种g2o内部的问题,而且我上一个项目到现在,没有更改过g2o库,就很懵,不知道该怎么解决这个问题.解决过程看了clear......
  • stm32移植FreeRTOS(手动)
    使用软件版本1.cubemxv5.3.02.stm32芯片包:Keil.STM32F4xx_DFP.2.16.0/Keil.STM32F1xx_DFP.2.4.03.FreeRTOS版本:FreeRTOSv202212.004.ARM编译器版本AC5,注意:AC6编译器使用ARMClang编译,本教程将不再适用移植步骤1.FreeRTOSsource文件夹下的如下文件拷贝到keil工程2.在keil......
  • 8.new-delete操作与malloc-free的操作异同
    相同点●都可用于内存的动态申请和释放●new和malloc都可以分配指定大小的内存块,并且分配的内存都在堆上。●new和malloc的结果都返回一个指向已分配内存的指针。●都允许使用字面量作为参数来分配内存。不同点●前者是C++运算符,后者是C/C++语言标准库函数●new自动计算要......
  • 10.malloc和new的区别?
    malloc和free是标准库函数,支持覆盖;new和delete是运算符,支持重载。malloc仅仅分配内存空间,free仅仅回收空间,不具备调用构造函数和析构函数功能,用malloc分配空间存储类的对象存在风险;new和delete除了分配回收功能外,还会调用构造函数和析构函数。malloc和free返回的是void类型指针......
  • 12.被free回收的内存是立即返还给操作系统吗?
    不是的,被free回收的内存会首先被ptmalloc使用双链表保存起来,当用户下一次申请内存的时候,会尝试从这些内存中寻找合适的返回。这样就避免了频繁的系统调用,占用过多的系统资源。同时ptmalloc也会尝试对小块内存进行合并,避免过多的内存碎片。......
  • 11.既然有了malloc-free,C++中为什么还需要new-delete呢?直接用malloc-free不好吗?
    malloc/free和new/delete都是用来申请内存和回收内存的。在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行析构函数。而malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能强加给malloc/free,所以new/delete是必不可少......
  • FreeNAS系统基本安装篇
    一、FreeNAS介绍:1.1介绍FreeNAS是一套免费的NAS服务器,它能将一部普通PC变成网络存储服务器。该软件基于FreeBSD,Samba及PHP,支持CIFS(samba),FTP,NFSprotocols,SoftwareRAID(0,1,5)及web界面的设定工具。用户可通过Windows、Macs、FTP、SSH及网络文件系统(NFS)来访......
  • Freertos学习08-queue基本发送与接受
    一、前言队列是任务间通信的主要形式。它们可以用于在任务之间以及中断和任务之间发送消息。队列是一个先进先出(FIFO)的数据结构,类似于现实生活中的排队。任务可以将数据项放入队列的末尾,然后另一个任务可以从队列的开头取出这些数据项。这种方式可以实现任务之间的数据共享和通......
  • 韦东山freeRTOS系列教程之【第四章】同步互斥与通信
    文章目录系列教程总目录概述4.1同步与互斥的概念4.2同步与互斥并不简单4.3各类方法的对比系列教程总目录本教程连载中,篇章会比较多,为方便同学们阅读,点击这里可以查看文章的目录列表,目录列表页面地址:javascript:void(0)概述本章是概述性的内容。可以把多任务系统当做一个团队,......