其他分享
首页 > 其他分享> > c的free 为什么不需要知道大小

c的free 为什么不需要知道大小

作者:互联网

malloc

malloc函数在运行时分配内存。它需要以字节为单位的大小并在内存中分配那么多空间。这意味着malloc(50)将在内存中分配50个字节。它返回一个void指针

calloc

与malloc一样,calloc也在运行时分配内存,并在stdlib.h中定义。它需要元素的数量和每个元素的大小(以字节为单位),将每个元素初始化为零,然后返回一个指向内存的void指针。

void * calloc(n,element-size);

这里,'n'是元素的数量,'element-size'是每个元素的大小。

 

这里都会指定大小, 那为什么free的时候,只需要void free(指针)呢?

比较常见的实现是隐藏块头

https://www.zhihu.com/question/20362709

当调用malloc(size)时,实际分配的内存大小大于size字节,这是因为在分配的内存区域头部有类似于
struct control_block {
unsigned size;
int used;
};
这样的一个结构,如果malloc函数内部得到的内存区域的首地址为void *p,那么它返回给你的就是p + sizeof(control_block),而调用free(p)的时候,该函数把p减去sizeof(control_block),然后就可以根据
((control_blcok*)p)->size得到要释放的内存区域的大小。这也就是为什么free只能用来释放malloc分配的内存,如果用于释放其他的内存,会发生未知的错误。

但是当有大量的小的内存块分配的时候, 都需要加上块头,这种分配分式就不友好啦. 

 

基于chunk 的管理

https://www.zhihu.com/question/302440083

把整个虚拟内存地址空间分成(看作)连续的 chunk,每一个 chunk 有固定的尺寸(一般是 4k*n,n >= 1),并且按自身对齐。以 4k 为例,那么第一个 chunk 是 [0,4095] 这一段,第二个 chunk 是 [4096,8191],第三个 [8192,12287]…以此类推。每一次从虚拟内存上分配时都按 chunk 分配(因为虚拟内存是基于 paging 的,所以一定能保证按自身对齐),然后再在 chunk 上管理小尺寸分配。这样,在 free 的时候,只要把入参地址除以 chunk 的尺寸(实践中是地址对齐,用位运算即可),就能得到这个地址所属的 chunk。chunk 的头部存放了它的管理结构,所以能得知 free 的正确尺寸。chunk 管理上可以有不同的算法,一个比较有效的做法是 freelist:即把一个 chunk 再分成若干个相同尺寸的小块,并用指针把它们连接起来形成链表结构,malloc 和 free 都维护这个链表就行了。不同尺寸的 malloc 会落入不同的 chunk,而 free 总是能找到对的那个 chunk。

 

malloc返回的指针有双重作用,一是新分配的内存起始地址,二是内存资源的句柄(Handle),即管理器内部分配的编号。

对于任何资源管理器来说,只要给出句柄就能找到资源的全部信息了。

标签:为什么,malloc,chunk,free,内存,大小,分配,size
来源: https://www.cnblogs.com/horysk/p/16070866.html