[开发工具] malloc函数与free函数

[复制链接]
 楼主| febgxu 发表于 2022-8-28 20:42 | 显示全部楼层 |阅读模式
Malloc函数是什么?
malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址。malloc分配的内存大小至少为size参数所指定的字节数

malloc的返回值是一个指针,指向一段可用内存的起始地址

Malloc和free是C标准库中提供的普通函数,malloc和free是配对使用的一对函数。malloc负责向堆区申请一块内存,free负责释放

为什么要用malloc函数?
我们首先引入内存泄露的概念:

什么是内存泄漏(memory leak)?

内存泄露指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

我们来举一个实际的例子,假如我们手头有一款单片机,我们要用它的串口功能,于是我们在栈空间创建了一个int类型的数组a[ ]来存放串口数据,传输完以后就干别的,不用这个数组了,但是这个闲置的数组就占用了一块空间,如果数组很大呢?如果有很多个这样的数组呢?这样占用的空间无疑是可怕的,特别是对于存储空间较小的单片机来说。这就是俗话说的“占着茅坑不拉屎”。

于是我们便需要malloc函数和free函数了,还是单片机,还是用串口,此时我们不再直接创建数组了,而是用malloc()申请一块内存,然后在这块内存中创建数组,使用完以后我们就用free()直接释放了它,这样我们就可以更大程序的利用单片机的存储空间了。

Malloc函数的使用
①  char*a=NULL;//声明一个指向a的char*类型的指针

②  a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a

③  free(a);//释放掉使用的内存地址

malloc函数和free函数的执行方式
malloc

调用malloc函数时,它沿连接表从前向后,寻找一个没有被占用的,而且大到足以满足用户请求所需要的内存块。在寻找过程中,分三种情况。

    第一种情况,倘若可用而且大小刚好合适,那么直接将此块返回就完成了分配。

  第二种情况,倘若可用而且超过了所需要的内存块并且还能容纳一个新块的控制头部,这个时候就将此块一分为二。将分配给用户的那块内存的相应标志位置0(不再可用),然后将此块的有效数据区首地址作为函数值返回。而新块的控制头部要进行赋值(只有含有头部的块才能称的上一个块),没有控制头部的块不能进行管理。

   第三种情况,倘若可用内存块的空间小于需要的空间,或者虽然超过了但是不能腾出一个控制头部,最终的处理都是跳过改块,移动到链表的下一块进行新一轮的比较。

free

  free函数用于内存块的回收,当不用的内存块调用此函数释放空间的时候,将相应标志位置1(可以重新分配)。接下来要做的就是整合内存碎片。由于可能多次malloc函数,产生了很多的内存碎片,在释放一个块的时候,不仅要标记此块为“可用”。另外,还需要试着将此块前后的块进行合并,这样才能为将来申请更大的空间做好准备。 作者:白常香 https://www.bilibili.com/read/cv6332182/ 出处:bilibili

勇敢的大白菜 发表于 2022-9-1 18:11 | 显示全部楼层
这个内存释放的很有好处的,不然很难办的。不错的。
嵌入小菜菜 发表于 2022-9-1 21:19 | 显示全部楼层
会不会进行内存泄漏?还是?
houjiakai 发表于 2022-9-3 16:36 | 显示全部楼层
如何查看malloc
timfordlare 发表于 2022-9-3 17:22 | 显示全部楼层
malloc,free和new,delete有区别吗?
i1mcu 发表于 2022-9-3 19:40 | 显示全部楼层
是不是free()函数只能用来释放通过malloc建立的内存空间?
alvpeg 发表于 2022-9-3 20:06 | 显示全部楼层
malloc()和free()的基本概念以及基本用法
zerorobert 发表于 2022-9-3 21:50 | 显示全部楼层
变量分配的空间有什么区别吗?
yujielun 发表于 2022-9-4 22:20 | 显示全部楼层
C语言的标准库函数     
sdlls 发表于 2022-9-5 13:04 | 显示全部楼层
malloc是申请内存的,free是释放内存的
hearstnorman323 发表于 2022-9-5 14:09 | 显示全部楼层
通俗讲就是一个分配空间的函数
robertesth 发表于 2022-9-5 15:00 | 显示全部楼层
为什么malloc()和free()函数会产生很多内存碎片
tifmill 发表于 2022-9-5 16:00 | 显示全部楼层
使用malloc和free有哪些注意事项?
Bowclad 发表于 2022-9-5 22:12 | 显示全部楼层
使用malloc必须检查内存有没有申请成功
Bowclad 发表于 2022-9-5 22:13 | 显示全部楼层
使用完成后要马上free节省内存
MessageRing 发表于 2022-10-4 20:41 | 显示全部楼层
new不会失败,malloc可能会申请失败
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

5042

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部