C语言 free() 内存释放问题

转载:https://blog.****.net/Zzy_ZhangZeyu_/article/details/24848569

 

我们知道free(p)是释放掉p所指向的内存,那么是释放了多长的一段内存呢?我们的系统是如何知道要释放多少内存的呢?下面我来讲讲这个问题。

 

请看下面一段代码

C语言 free() 内存释放问题

 

显然, pchar 和 pint 均被分配了4个字节的内存。

那么:

(1)    free(pchar);

(2)    free(pint);

这两条语句是释放了多少的内存呢?

语句(1)中是释放了8个字节的内存还是1个char数据所占的内存?

语句(2)中是释放了8个字节的内存还是1个int数据所占的内存呢?

 

    实际上,无论是语句(1)还是语句(2)都释放了8个字节内存,和他所指向的数据类型没有关系。决定free(p)释放多大的内存块,是在malloc的时候就已经确定了的,大多数实现分配存储空间的时候实际所分配的空间会比要求的大一些,额外的分配的空间会用来记录管理信息,比如分配块的长度,指向下一个分配块的指针等等...所以说你malloc分配了多少空间,free的时候就会释放相对应的空间大小。

 

再看下面一段代码

C语言 free() 内存释放问题

 

上面这段代码或许能够正常运行,但实际上是错误的。

C语言 free() 内存释放问题

 

上面这段代码没什么问题,问题出在下面的代码上

C语言 free() 内存释放问题

 

我们已经知道调用free的时候释放内存的大小是在malloc的时候就确定下来了的,一旦指针指向了malloc所分配的那段内存,内存释放的时候就会释放在malloc时所申请的那段大小(本例中是1000字节),如果改变了指针的指向,比如向后或者向前移动了一段位置,程序运行时往往会出现错误,而且该错误极其隐蔽。

C语言 free() 内存释放问题

 

上图给出了非常直观的图示便于理解。