参照https://zhuanlan.zhihu.com/p/367060283
内存申请与释放
程序员经常使用的内存申请方式被称为动态内存分配。
我们需要动态的去进行内存分配与释放是因为不能提前知道程序到底需要使用多少内存,有当程序真的运行起来后我们才知道。
如果能提前知道我们的程序到底需要多少内存,那么直接知道告诉编译器就好了,这样也不必发明malloc等内存分配器了。
void main()
{
int n;
scanf("%d",&n);
char *str = (char*)malloc(sizeof(char)*n);
}
内存分配与释放相关要点
1、我们怎么知道有哪些内存块是空闲的呢?(怎么区分空闲内存块与已分配内存块)
2、我们该选择什么样的空闲内存块给到用户?(空闲内存块有很多)
3、分配出去内存后,空闲内存块剩余的空间该怎么处理?
4、用户归还的内存该怎么处理?
内存分配与释放
内存分配:
将空闲内存块进行划分,前一部分设置为已分配,返回给内存申请者使用,后一部分变为一个新的空闲内存块。
内存释放:
释放内存时不需要指定大小,因为我们从要释放的指针地址上移,通过header就能知道该内存块的所有信息。
内存合并:
应用程序向我们的malloc释放内存时,我们查看一下相邻的内存块是否是空闲的,如果是空闲的话我们需要合并空闲内存块。高效地合并空闲内存块,需要header与footer,上一内存块的footer和下一个内存块的header是相邻的。因此我们只需要在当前内存块的位置向上移动4直接就可以等到上一个内存块的信息,这样当我们释放内存时就可以快速的进行相邻空闲内存块的合并了。