C语言中的 free() 函数理解

本文探讨了C语言中free()函数的工作原理,包括如何确定释放空间大小、释放的内容、指针是否应设为null以及free( pointer + 1)的无效性。free()函数在释放内存时会依据内存头部的大小信息,释放指定地址开始的连续空间,释放后内存中的数据变为随机值。建议释放内存后将指针设为null,避免悬挂指针。同时,释放不存在或非首地址的空间会导致错误。

C语言中的 free() 函数理解

C语言当中 free() 函数与 malloc() 函数应是成对出现的:
malloc() 函数负责空间的申请, malloc() 函数的对头free() 函数则负责将 malloc() 函数申请的空间给释放掉;
#include <stdio.h>
#include <stdlib.h>

#define 	MALLOC_SIZE		250

int main(void)
{
	//申请一段长度为250,类型为 char 的空间
	char *pointer = null;
	pointer = (char *)malloc( MALLOC_SIZE * sizeof(char) );
	
	//释放空间
	if(null != pointer)
	{
		free( pointer );
		pointer = null;
	}
	
	return 0;
}

以上是个申请空间又释放掉的显得闲得蛋疼的例子,那问题来了:

  1. free() 函数是如何确定要释放空间大小的?
  2. free() 函数释放掉的是什么内容呢?
  3. 指针 pointer 不指向 null 行不行?
  4. 不判断 null != pointer 是否必要?
  5. free( pointer + 1),能否释放?

以下为个人的理解:
第一点:申请空间的大小是由用户决定的,系统有基于链表的内存管理,申请得到的空间在物理空间上不一定连续的,但申请到的空间映射出的虚拟空间是连续的,申请空间时,对于系统来说,系统只会关注申请空间的大小,并不关注空间类型,所以申请空间返回的空间也不具有特定的空间类型,只是分配了一段空间供用户使用; malloc函数返回来的是申请到空间的地址,然后用户使用一个指针指向这块空间,便可以使用了;在申请到空间的开始地址前的空间会记录着空间的大小,因此在 free() 释放空间时会先去确认空间的大小,再进行空间释放。
第二点:
在这里插入图片描述
空间结构的大致图示,假设此时指针 pointer 指向空间首地址0x0001,空间中存用户想要存储的数据,调用 free( pointer ) 函数,会将空间的内存给释放掉,也算是将空间的使用权给释放掉,释放后用户无法合法访问这段空间,释放掉后的空间存储的数据是随机值,释放后的空间可在下次申请空间时循环使用,若使用完之后空间不释放,则这块空间无法归还给系统,无法再次利用,导致内存泄漏;
第三点:调用调用 free( pointer ) 函数,指针 pointer 是不会被释放掉的,即便释放空间后,指针 pointer 还是指向地址0x0001的地方,释放后再继续调用指针则会越界,为了避免此类错误,最好在释放空间后将指针指向null;
第四点:释放空间前最好先判断一下 null != pointer ,因为有可能出现系统空间不足导致申请空间失败的情况,也就无法进行空间释放了;
第五点:free( pointer + 1) 是无法释放空间的,因为申请空间的地址不匹配了,而且无法找到这段空间大小的记录,导致释放空间失败;只有地址与申请空间的首地址匹配,系统查找到合理的空间长度记录才会进行空间释放操作;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值