BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #51522同步于 2011/4/20
CPP机器人发帖

[合集] 请教一个面试被问到的问题(malloc和free)

shenlei
2011/4/20镜像同步0 回复
☆─────────────────────────────────────☆ youlingman (好吧。) 于 (Sat Apr 9 23:47:34 2011) 提到: 当用malloc申请空间时有指定申请的空间大小,对应free释放空间时是怎么知道该释放多大的内存空间? 综合了一下,大概思路是malloc时申请的实际空间会比要求的要大一点,申请的对应空闲内存块的前端有个冗余的块(block)存放后面这一内存块的大小信息与是否可用标志。 这里主要问的应该是标准C语言的malloc和free函数的实现,只涉及到程序层面,系统层面的内存管理细节就不深究了。 ☆─────────────────────────────────────☆ fentoyal (长风长歌) 于 (Sat Apr 9 23:54:21 2011) 提到: 【 在 youlingman 的大作中提到: 】 : 当用malloc申请空间时有指定申请的空间大小,对应free释放空间时是怎么知道该释放多大的内存空间? : -- 空间的前几个字节是存空间大小的。 记不是很清了,lz可以再搜搜 ☆─────────────────────────────────────☆ youlingman (好吧。) 于 (Sun Apr 10 00:09:19 2011) 提到: 我当时回答是说在内存块前端有大小信息,貌似面试官不太满意。然后有个师兄说对应内存大小是存在编译器的符号表内的。网上搜到的暂时还没有讲得详细点的。 【 在 fentoyal 的大作中提到: 】 : : 当用malloc申请空间时有指定申请的空间大小,对应free释放空间时是怎么知道该释放多大的内存空间? : : -- : 空间的前几个字节是存空间大小的。 : ................... ☆─────────────────────────────────────☆ hardy616 (猴子帮帮主) 于 (Sun Apr 10 08:23:33 2011) 提到: 莫非是bloomberg的实习面试? ☆─────────────────────────────────────☆ guitarfeng (czf) 于 (Sun Apr 10 09:25:33 2011) 提到: http://www.xici.net/#d127148436.htm http://hi.baidu.com/wade_hit/blog/item/872f8d291913752a5343c181.html depend on your os ☆─────────────────────────────────────☆ txmm (你被tx啦!) 于 (Sun Apr 10 09:25:49 2011) 提到: 菜鸟学习 ☆─────────────────────────────────────☆ wks (cloverprince) 于 (Sun Apr 10 09:36:55 2011) 提到: implementation dependent吧 ☆─────────────────────────────────────☆ zxsword (小绝) 于 (Sun Apr 10 10:35:14 2011) 提到: “对应内存大小是存在编译器的符号表内的?”。。。这一句我看不懂啊 讨论的是C吧,我觉的不是在符号表中。C的符号表中,就符号名和地址,没别的东西了,依稀记得。 不同的系统会有不同的实现细节,我知道的是在malloc到的内存头部中有信息来着,不知道还有啥别的实现方式了=。= ☆─────────────────────────────────────☆ freeflying (Artie) 于 (Sun Apr 10 11:55:48 2011) 提到: void free(void *ptr) { struct mem_control_block *free; free = ptr - sizeof(struct mem_control_block); free->is_available = 1; return; } struct mem_control_block { int is_available; //这是一个标记? int size; //这是实际空间的大小 }; 参考http://www.bccn.net/Article/kfyy/cyy/jszl/200608/4238_2.html的描述,此处作者也是在探讨 ☆─────────────────────────────────────☆ txmm (你被tx啦!) 于 (Sun Apr 10 12:24:25 2011) 提到: 昨天面试被问到。class可不可以派生自一个struct。。。md ☆─────────────────────────────────────☆ renne (歼灭天使 玲) 于 (Sun Apr 10 12:34:55 2011) 提到: 可以吧? 【 在 txmm (你被tx啦!) 的大作中提到: 】 : 昨天面试被问到。class可不可以派生自一个struct。。。md ☆─────────────────────────────────────☆ doubleTao (doubleTao) 于 (Sun Apr 10 12:46:13 2011) 提到: 《C++编程思想》有动态内存一章中有清晰的讲解,去翻翻吧。。。。其实,内存的大小和地址都在指针返回之前就已经记录下了,只是对程序员透明。祝好! ☆─────────────────────────────────────☆ txmm (你被tx啦!) 于 (Sun Apr 10 12:50:31 2011) 提到: 【 在 renne 的大作中提到: 】 : 可以吧? : 【 在 txmm (你被tx啦!) 的大作中提到: 】 : : 昨天面试被问到。class可不可以派生自一个struct。。。md : ................... 我猜的不可以,不过貌似是可以的。。无奈了。。这么偏的问题。。 ☆─────────────────────────────────────☆ youlingman (好吧。) 于 (Sun Apr 10 13:00:01 2011) 提到: 最经有什么公司找实习呀?没捞到什么面试机会呢。 【 在 txmm 的大作中提到: 】 : : 可以吧? : : 【 在 txmm (你被tx啦!) 的大作中提到: 】 : : : 昨天面试被问到。class可不可以派生自一个struct。。。md : ................... ☆─────────────────────────────────────☆ doubleTao (doubleTao) 于 (Sun Apr 10 13:01:16 2011) 提到: 【 在 txmm 的大作中提到: 】 : 昨天面试被问到。class可不可以派生自一个struct。。。md : -- 面试问的都这么。。。我觉得可以吧,好像只是访问控制上有不同 ☆─────────────────────────────────────☆ FadeToBlack (烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫*&^) 于 (Sun Apr 10 13:04:18 2011) 提到: 原来是这样啊,受教了! 【 在 youlingman 的大作中提到: 】 : 我当时回答是说在内存块前端有大小信息,貌似面试官不太满意。然后有个师兄说对应内存大小是存在编译器的符号表内的。网上搜到的暂时还没有讲得详细点的。 ☆─────────────────────────────────────☆ txmm (你被tx啦!) 于 (Sun Apr 10 13:10:07 2011) 提到: 【 在 youlingman 的大作中提到: 】 : 最经有什么公司找实习呀?没捞到什么面试机会呢。 : 【 在 txmm 的大作中提到: 】 : : : 可以吧? : ................... 我目前也只面了两个。。多等消息ing、、如果不要我。。。额。。 ☆─────────────────────────────────────☆ txmm (你被tx啦!) 于 (Sun Apr 10 13:10:49 2011) 提到: 【 在 doubleTao 的大作中提到: 】 : : 昨天面试被问到。class可不可以派生自一个struct。。。md : : -- : 面试问的都这么。。。我觉得可以吧,好像只是访问控制上有不同 : ................... 恩。后来一想应该是可以。。可惜没答对。 ☆─────────────────────────────────────☆ jmpesp (心爱走天涯 ) 于 (Sun Apr 10 13:50:31 2011) 提到: 【 在 youlingman 的大作中提到: 】 : 当用malloc申请空间时有指定申请的空间大小,对应free释放空间时是怎么知道该释放多大的内存空间? : 综合了一下,大概思路是malloc时申请的实际空间会比要求的要大一点,申请的对应空闲内存块的前端有个冗余的块(block)存放后面这一内存块的大小信息与是否可用标志。 编译器相关 ☆─────────────────────────────────────☆ yangxiao (木水年华) 于 (Sun Apr 10 13:58:45 2011) 提到: 【 在 txmm 的大作中提到: 】 : 昨天面试被问到。class可不可以派生自一个struct。。。md : -- 这个其实很基础,在c++中struct和class只有两个区别:1、默认的访问控制 2、默认的继承控制,struct默认是public,class是private ☆─────────────────────────────────────☆ youlingman (好吧。) 于 (Sun Apr 10 14:07:13 2011) 提到: 能说的详细点么? 【 在 jmpesp 的大作中提到: 】 : : 【 在 youlingman 的大作中提到: 】 : : 当用malloc申请空间时有指定申请的空间大小,对应free释放空间时是怎么知道该释放多大的内存空间? : ................... ☆─────────────────────────────────────☆ jmpesp (心爱走天涯 ) 于 (Sun Apr 10 14:17:11 2011) 提到: 【 在 youlingman 的大作中提到: 】 : 能说的详细点么? 这样说吧,库也是人写的,不管你采用什么方法,基本思路都是一样的,也就是你肯定是记忆了你已经分配了多少内存,然后释放的时候才可以不经过人工干预而释放。 只是这如何记忆多少字节呢?不同的人有不同的实现,你可以分配的时候额外多分配一些空间记录分配的空间数量,你也可以统一建立一个表格,每次分配的时候填入对应项,释放的时候查找表格就ok,等等,方法很多,只是时间空间效率不同而已。 so,编译器相关,或者准确的说,是实现相关。。。 ☆─────────────────────────────────────☆ TRone (在粤版。嗯。还有在本版。) 于 (Sun Apr 10 18:23:19 2011) 提到: 【 在 jmpesp 的大作中提到: 】 : : 【 在 youlingman 的大作中提到: 】 : : 能说的详细点么? : ................... 我也觉得是...最后的结果都是对程序员透明... ☆─────────────────────────────────────☆ Jack204 (Jack204) 于 (Sun Apr 10 19:39:41 2011) 提到: 比如我们自己实现一个malloc和free函数,os为每个进程的虚拟内存中分配了一个堆,可供我们动态的申请。估计就是在动态申请的时候malloc函数会生成一张内存动态申请的表,表中可能记录着这次动态申请的首指针与申请的内存空间的大小(具体实现不一定,但实现功能就行),free的时候再查表,释放,把这块空间归还给空闲内存的表中。。于是我们就可以很方便的使用malloc和free了。。。 我这么认为的。。 ☆─────────────────────────────────────☆ bystorm (bystorm) 于 (Mon Apr 11 18:41:42 2011) 提到: 【 在 youlingman 的大作中提到: 】 : 当用malloc申请空间时有指定申请的空间大小,对应free释放空间时是怎么知道该释放多大的内存空间? : 综合了一下,大概思路是malloc时申请的实际空间会比要求的要大一点,申请的对应空闲内存块的前端有个冗余的块(block)存放后面这一内存块的大小信息与是否可用标志。 : 这里主要问的应该是标准C语言的malloc和free函数的实现,只涉及到程序层面,系统层面的内存管理细节就不深究了。 malloc就是封装的系统调用阿,malloc是程序员自己对系统的内存进行分割,操作系统专门有一个链表来记录哪些用户申请了内存,并用cookie记录下来了。所以,凡是用malloc申请的内存都是有系统释放掉的,这也是堆空间与栈空间的区别吧。
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。