Chinaunix

标题: 在C语言中,free()函数怎么知道释放多大的空间? [打印本页]

作者: 梦醒潇湘love    时间: 2013-08-17 21:39
标题: 在C语言中,free()函数怎么知道释放多大的空间?
​    问题:在C语言中,free()函数怎么知道释放多大的空间?
​    在C语言中,可以传递任意类型的指针作为free()函数的参数,但是free()函数怎么知道需要释放多少已分配的内存空间呢?当传递一个指针给某些函数的同时,不得不传递相应的所占空间的大小(例如,10个char类型的元素组成的数组,作为函数参数的同时,需要将其长度10作为函数参数传递),但是,并没有传递给free()指针所指向空间的大小啊。
作者: seufy88    时间: 2013-08-17 22:00
我认为GLIBC库或是内核记录了该地址对应的申请空间大小等类似的管理信息.所以你只需要传递一个地址给free.free函数根据地址可以知道需要释放点多大的内存空间
个人愚见.
作者: 梦醒潇湘love    时间: 2013-08-17 22:07
回复 2# seufy88


    好的 谢谢您
作者: wait_rabbit    时间: 2013-08-17 22:28

malloc申请的不仅仅是可用内存空间,还有一个私有的记录头部。该头部记录了所申请空间的详细信息。
作者: yshwuxian    时间: 2013-08-17 22:31
其实本科《操作系统》课程就讲到过基本原理额。。
作者: lcyjlu    时间: 2013-08-18 12:20
回复 4# wait_rabbit


    获益匪浅,但是请问,它是记录在什么地方?
作者: solu    时间: 2013-08-18 12:46
回复 5# yshwuxian


    哪本书, 第几页
作者: yshwuxian    时间: 2013-08-18 22:37
回复 7# solu


    动态内存分配原理都要讲的吧。空闲链表的结构。
作者: solu    时间: 2013-08-19 00:31
回复 8# yshwuxian


    哪本书? 第几页。

不要想当然。
作者: lingshaohusoft    时间: 2013-08-19 09:06
这主要是和glibc的内存管理机制有关。glibc中,为每一块内存维护了一个chunk的结构。glibc在分配内存时,glibc先填写chunk结构中内存块的大小,然后是分配给进程的内存。


chunk ------size
p------------ content


在进程释放内存时,只要 指针-4 便可以找到该块内存的大小,从而释放掉。

注:glibc在做内存申请时,最少分配16个字节,以便能够维护chunk结构。

作者: Aquester    时间: 2013-08-19 13:14
梦醒潇湘love 发表于 2013-08-17 21:39
​    问题:在C语言中,free()函数怎么知道释放多大的空间?
​    在C语言中,可以传递任意类 ...


遇到这种问题时,最好能想想如果自己来实现,如何做?
作者: wsw1wsw2    时间: 2013-08-19 14:32
+-----+
|        |----> 这里的数据结构就是保存这块内存有多大之类的信息。
|        |
|        |----> 你的指针的位置
|        |   下面是你的数据
作者: yshwuxian    时间: 2013-08-19 18:07
什么叫不要想当然??我当时为了完成课程实验,完全用宏实现了空闲链表,完成了first-fit,best-fit和next-fit分配算法。
作者: yshwuxian    时间: 2013-08-19 18:30
回复 9# solu


    什么叫不要想当然??我当时为了完成课程实验,完全用宏实现了空闲链表,完成了first-fit,best-fit和next-fit分配算法。
作者: solu    时间: 2013-08-19 22:11
yshwuxian 发表于 2013-08-19 18:30
回复 9# solu

 问题:在C语言中,free()函数怎么知道释放多大的空间?


那你倒是说说哪本“操作系统”书写了“free()函数怎么知道释放多大的空间” , 多少页!

说不出来就是想当然。
作者: yshwuxian    时间: 2013-08-19 22:46
回复 15# solu


    西安电子科技大学操作系统第三版P123 图4-6空闲链结构。自己看去。回收内存在P125。如果看了这个还不明白free的原理我只能怀疑您的智商了。
作者: solu    时间: 2013-08-20 09:21
yshwuxian 发表于 2013-08-19 22:46
回复 15# solu



我无所谓明白不明白, 我只是怀疑你信口开河。

况且无图无真相, 谁知道西安电子科技大学用的是哪本书。
作者: yshwuxian    时间: 2013-08-20 09:34
回复 17# solu


    西安电子科技大学出版社。
作者: yshwuxian    时间: 2013-08-20 09:43
本帖最后由 yshwuxian 于 2013-08-20 09:53 编辑

回复 17# solu


   你不是怀疑我,而是怀疑操作系统课程里有没有这部分内容。可见你根本没学好操作系统否则不会连这都怀疑。承认自己没学好就是了,实在不行拿出书来自己翻翻看,不要摆出一副高高在上的姿态。


当然如果您没学过操作系统的话,那除了您随便质疑别人之外其他的倒是可以理解。


另外,是不是如果您认为您是人的话,您必须爆照才能让我等信服,否则就是信口开河啊?
作者: linux_c_py_php    时间: 2013-08-20 10:42
又惊现喷子, 膜拜.
作者: solu    时间: 2013-08-20 21:20
yshwuxian 发表于 2013-08-20 09:43
回复 17# solu


你错了,我就是怀疑你信口开河。

在我说了这话之后你才战战兢兢的去翻了一下书,然后“信誓旦旦”的告诉我说: 看, 就是在这里。
作者: solu    时间: 2013-08-20 21:22
yshwuxian 发表于 2013-08-20 09:43
回复 17# solu


另外, 我无须向你证明我是不是人,所以我也无须给你爆出我的照片。

不好意思, 让你的愿望落空了。
作者: cokeboL    时间: 2013-08-20 21:44
哎,天热火大,又吵起来了,淡定淡定,找个妞泄泄火吧
作者: solu    时间: 2013-08-20 22:13
cokeboL 发表于 2013-08-20 21:44
哎,天热火大,又吵起来了,淡定淡定,找个妞泄泄火吧


我一句粗口也没爆不是?
作者: cokeboL    时间: 2013-08-20 22:38
回复 24# solu


    是滴~   这几天热的,我都起痱子了      
作者: 460646359    时间: 2013-08-20 22:52
来学习
作者: 460646359    时间: 2013-08-20 22:52
来学习
作者: yshwuxian    时间: 2013-08-20 22:54
回复 21# solu


    你才信口开河,你说我战战兢兢去翻书,可有证据表明我“战战兢兢”而不是“泰然自若”??如果你找不出来就是你在信口开河。
作者: tongban1981    时间: 2013-08-21 09:44
自己没有研究过malloc的实现,不过看过类似的,觉得malloc应该也差不多是这种方式

str = malloc(size);

系统内部分配size+4, 返回时返回后面size的地址,前面记录空间长度。
一般都是这种原理,如果复杂的,头部结构可以是更复杂的数据结构,以应对高级需求。
作者: lin5161678    时间: 2013-08-21 09:50
malloc 和 free 内部自己维护
不必深究
+
无法深究

因为可以有灰常多种不同的做法

作者: fender0107401    时间: 2013-08-21 15:49
这个问题我也问过。
作者: bluesky2254    时间: 2013-08-22 22:13
本帖最后由 bluesky2254 于 2013-08-22 22:14 编辑

char *p = malloc(0);
p获得了地址吗?
if(p)
    puts("Got it!");
else
     puts("failed!");

作者: bluesky2254    时间: 2013-08-22 22:17
再看: 下面的代码会出现内存泄漏吗?
int i = 1000 * 1000;
char *p;

while(i-- > 0){
    p = malloc(0);
}

free(p);

作者: 梦醒潇湘love    时间: 2013-08-23 10:05
回复 31# fender0107401


    版本 答案是啥啊  或者说原理是啥  请指教
作者: zheguzai    时间: 2013-08-23 22:16
回复 15# solu


    这不是想当然,你不懂就别乱说,好好看看动态内存分配,还有堆中的空闲空间是怎么记录的,unix高级编程看过没,里边就有,不要问第几页,没这个义务。

作者: solu    时间: 2013-08-24 17:15
本帖最后由 solu 于 2013-08-24 17:17 编辑
zheguzai 发表于 2013-08-23 22:16
回复 15# solu


老子又没问你, 你装什么B。

就你这水平, 老子不屑问。
作者: zheguzai    时间: 2013-08-25 07:09
回复 36# solu


    就你这种垃圾,吃屎还想让别人给你找好帮你喂呢。
我从来不装b,不懂就不懂,人家能回答的问题肯定懂得比我多,至少不会像你一样,不懂了问别人,人家告诉你了,说人家是想当然,人跟人的区别怎么这么大呢
作者: solu    时间: 2013-08-25 14:51
zheguzai 发表于 2013-08-25 07:09
回复 36# solu



老子从来不问别人, 老子那是反问别人,你语文课是体育老师教的吧? 还听不懂人话了? 哦, 对了, 我忘记了你不是人, 不好意思哈!

你这种牛犊子还想瞎起哄, 老子蔑视你,你知道不? 

你承认你很菜,你承认我懂得比你多, 那就对了, 不懂的时候,还要多多请教别人,而不是在这里发恼骚,对吧。

不过像你这种刚生下来头被b夹过的人, 再怎么努力也是没用的了, 除非回炉再造。

大清早的就起来加班,也真难为你了, 作为屌丝的你, 只有比别人更努力,才能弥补你的先天不足, 我看好你!






欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2