关于malloc和free

简介: 关于malloc和free

malloc

指在堆区开辟空间给用户使用,而这个区域最大是取决于内存大小

free

free(void* p)的参数只有一个,把用malloc开辟的空间销毁掉,而free仅仅传入的是一个首地址,那么free是怎么确定malloc开了多少个字节的呢?

决定free释放多大的内存块,是在malloc的时候就已经确定了

实际上在malloc的时候,会自动在p地址的前面4或8个字节内,额外分配空间,用来记录管理信息,随后free( p) 时会自动偏移,所以用户不必操心,大致原理如此,细节可能有误

free的作用

我们在写int *p=(int *)malloc(sizeof(int)*5)的时候,就在堆空间声明了这块区域属于我来使用,而free之后,意思是这块区域不归我使用了,就像去开房,我拿到的钥匙,free就是把钥匙归还给前台,就是向系统声明,这块区域不归我啦,但是这个时候p依旧指向这个区域,这个时候p就是野指针!所以要及时置为NULL


free()函数仅仅是告诉操作系统,这块空间我不用了,操作系统收回空间。而指向这块空间的指针并没有改变,它的值仍然指向这块空间。这样就可以继续使用该指针操作内存,这会带来非常大的安全隐患。所以合理地做法是,在调用free()函数后,将指针的也赋值为NULL。


目录
相关文章
|
4月前
|
C语言
C语言malloc与free实现原理
malloc()的实现很简单。它首先会扫描之前由 free()所释放的空闲内存块列表,以求找到尺寸大于或等于要求的一块空闲内存。(取决于具体实现,采用的扫描策略会有所不同。例如,first-fit 或 best-fito。)如果这一内存块的尺寸正好与要求相当,就把它直接返回给调用者。如果是一块较大的内存,那么将对其进行分割,在将一块大小相当的内存返回给调用者的同时,把较小的那块空闲内存块保留在空闲列表中。 如果在空闲内存列表中根本找不到足够大的空闲内存块,那么 malloc()会调用 sbrk()以分配更多
17 0
C语言malloc与free实现原理
|
6月前
|
存储 Cloud Native Linux
malloc、free 和 new、delete 的区别
malloc、free 和 new、delete 的区别
|
7月前
|
编译器 程序员 测试技术
详解动态内存管理【malloc/calloc/realloc/free函数/柔性数组】【C语言/进阶/数据结构基础】
详解动态内存管理【malloc/calloc/realloc/free函数/柔性数组】【C语言/进阶/数据结构基础】
174 0
|
5月前
|
程序员 编译器 C语言
C语言动态内存管理函数(malloc、free、calloc、realloc)
开辟内存空间的⽅式有两个缺点: • 空间开辟⼤⼩固定 • 数组声明时,必须指定数组的⻓度,长度⼀旦确定了便不能调整 而实际情况是,很多时候我们所需要的空间⼤⼩只有在程序运⾏后才能知道,为此C语⾔引⼊了动态内存开辟这个概念,让程序员⾃⼰可以申请和释放内存空间,这样就显得比较灵活了。
|
7月前
|
编译器 程序员 C语言
【C语言】动态内存管理(malloc,free,calloc,realloc,柔性数组)
【C语言】动态内存管理(malloc,free,calloc,realloc,柔性数组)
|
7天前
|
程序员 编译器 C语言
C语言知识:动态内存管理(malloc free calloc realloc)
C语言知识:动态内存管理(malloc free calloc realloc)
|
21天前
|
Java 程序员 编译器
C语言中灵活多变的动态内存,malloc函数 && free函数&& calloc函数 && realloc函数
C语言中灵活多变的动态内存,malloc函数 && free函数&& calloc函数 && realloc函数
|
25天前
|
程序员 编译器 C语言
【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解
【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解
|
2月前
|
编译器 C语言 C++
【C语言】free()函数详解(动态内存释放函数)
【C语言】free()函数详解(动态内存释放函数)
25 0
|
4月前
|
C语言
C语言——动态内存管理(malloc, calloc, realloc, free, 柔性数组详解)
C语言——动态内存管理(malloc, calloc, realloc, free, 柔性数组详解)