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分配了内存以后,肯定会有一个对所分配内存的记账,具体它是如何去
记账的,后面的文章介绍。
- malloc与free(1)
- malloc与free(2)
- malloc与free(3)
- new delete与malloc free之内存管理(1)
- malloc/free 与 new/free
- (malloc、free)与(new/delete)
- free与malloc
- malloc与free
- malloc与free 01
- malloc与free 02
- malloc 与 free
- malloc与free
- malloc 与free
- malloc与free详解
- 浅谈malloc()与free()
- malloc与free
- malloc 与Free
- malloc与free
- ioctl 函数
- 学习一种新的编程语言所要做的15个练习
- 网页分类技术介绍
- Arcgis for flex 给Google卫星地图加上地点名(道路图层)
- Hadoop安装
- malloc与free(1)
- jQuery textbox select checkbox radio 取值,设置值
- python串口编程整理(更新完)
- ViewPager的功能与使用
- 曾李青投资:看面相测智商 腾迅 创始人 天使投资 首席运营官
- grep的用法
- c# doubleBuffered
- Repeater控件里的大智慧
- WPF中的图片文件、byte[]、BitmapImage的操作