深入理解malloc和free

本文深入探讨了C语言中malloc和free的工作原理。free函数通过内存控制块结构来确定要释放的内存大小,它将指针回溯到内存控制块的位置进行标记为可用。malloc和free的内存管理涉及内存分配与释放的细节,对于理解和避免内存管理错误至关重要。
摘要由CSDN通过智能技术生成

1.为什么free是void*,那么它怎么知道要释放多少内存?

《UNIX环境高级编程》


《C语言编程常见问题解答》

《你必须知道的495个C语言问题》


《UNIX环境高级编程》


2.free源码

内存控制块结构定义

struct mem_control_block {
    int is_available;
    int size;
};

可能会认为当程序调用 malloc 时这会引发问题 —— 它们如何知道这个结构?答案是它们不必知道;在返回指针之前,我们会将其移动到这个结构之后,把它隐藏起来。这使得返回的指针指向没有用于任何其他用途的内存。那样,从调用程序的角度来看,它们所得到的全部是空闲的、开放的内存。然后,当通过 free() 将该指针传递回来时,我们只需要倒退几个内存字节就可以再次找到这个结构。

  在讨论分配内存之前,我们将先讨论释放,因为它更简单。为了释放内存,我们必须要做的惟一一件事情就是,获得我们给出的指针,回退 sizeof(struct mem_control_block) 个字节,并将其标记为可用的。

解除分配函数
void free(void *firstbyte) {
    struct mem_control_block *mcb;
/* Backup from the given pointer to find the
 * mem_control_block
 */
   mcb = firstbyte - sizeof(struct mem_control_block);
/* Mark the block as being available */
  mcb->is_available = 1;
/* That''s It!  We''re done. */
  return;
}


看一下函数第二句,这句非常重要和关键。其实这句就是把指向可用空间的指针倒回去,让它指向管理信息的那块空间,因为这里是在值上减去了一个结构体的大小!


3.查找free到底上哪儿查找需要释放的内存大小

都是指针前边的4个字节

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
	void *p1,*p2,*p3,*p4,*p5,*p6;
	p1=malloc(10);
	p2=malloc(38);
	p3=malloc(100);
	p4=malloc(200);
	p5=malloc(106);
	p6=malloc(300);
	return 0;
	
}



------------------------------------------

更多内容:

malloc()和free()的原理

C语言的malloc()和free()函数原理【整理】

使用_msize疏忽导致的bug

内存管理内幕

关于free如何知道要释放内存空间的长度问题(X86篇) [vs答案]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值