malloc与free(1)

来源:互联网 发布:冬季男装品牌 知乎 编辑:程序博客网 时间:2024/05/21 05:07

    前两天在看代码时发现一个问题,我们使用malloc时,会给出需要分配的内存的大小,而使用

free去释放内存时,只需要给出一个指向malloc返回值的指针就可以了。这是什么原理?

我开始以为他是根据指针的类型去做判断,那样的话,就没法去释放所有的内存了。另外之前,我也

碰到过一个问题,如下

int *p = (int *)malloc(0);

*p = 1;

printf(“%d\n”,*p);

free(p);

这都是没有任何问题的。

      既然出现了这么多问题,我就到网上去搜索答案,也就有了下面的一些回答,所以这篇文章表明为转载。

首先是百度知道的一个回答。

free()函数是怎样知道要释放的内存块的大小的?

答案是有的,但千万不要盲目参照。    free()函数对这一点的实现没有统一的标准,在不同的编译程序中,甚至在同一编译程序的不同版本中,
其实现都可能会有所不同。尽管free(),malloe(),calloe()和realloc()等函数的工作方式通常是相同的,
但它们完全可以采用任何可行的工作方式。    通常,当malloe()等内存分配函数分配一块内存时,它们所获取的内存总是比所要求的稍大一些。它们
返回的并不是这块内存的起始地址,而是一个比起始地址稍往后一点的一个地址。一些有关信息,例如所
分配的内存块的大小,将被存放在这两个地址之间的那部分区域中(如果这部分内容被改写,当所分配的这块内存被释放后你的程序中就会出现野指针)。这样,只要检查这
部分信息,free()函数就能知道要释放的内存块的大小了。    但是,free()函数并不一定就采用这种方式,它可能会使用一张记录所分配的内存的地址和长度的表,
或者将有关数据存放在所分配的内存块的尾部(在所要求大小的内存块后面的一小块内存中),或者通过一个
指针存放有关数据。    如果你真的想要编写一批内存分配函数,最好按自己的方式编写。
这个回答首先让我明白了一点,malloc分配了内存以后,肯定会有一个对所分配内存的记账,具体它是如何去

记账的,后面的文章介绍。