内存碎片的疑问

qwert1643ou65923 2011-06-16 12:29:25
上次面试有个人问我内存碎片是怎么处理的。把我问懵了 我一直以为 new malloc delete free 是不会产生内存碎片的。谁知道 来一起讨论下。。
...全文
172 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenyi0106 2011-06-17
  • 打赏
  • 举报
回复
对于业务不大,或者不是长时间运行的程序而言,确实作用不大:
因为OS内存的管理是OS层面的东西,分配和释放也是OS层面的,当你要求分配内存是,OS先是判断有没有合适大小的内存块,如果没有则找比你要求大的内存块,如果有,就分隔,然后提交给你的请求,如果没有则会自动进行内存整理,这个过程是OS完成了,也是比较费时的,当然你如果业务不大,或者不长时间运行,这点时间对系统而言就是小case,不值得一题。
更多有关内存管理方面的东西,最好看看操作系统这本书
kyotrue 2011-06-17
  • 打赏
  • 举报
回复
单线程new了马上delete当然不会产生碎片了,每次new的大小都一样也不会有碎片的
qwert1643ou65923 2011-06-17
  • 打赏
  • 举报
回复
你说的对,我刚才开了个循环不断申请和释放试了试。发现物理内存还是虚拟内存都没变化 也就是没有碎片产生。。。
那碎片是个杂回事呢
向立天 2011-06-16
  • 打赏
  • 举报
回复
看看the c programming language
其中有对这类函数实现原理的讲解
shenyi0106 2011-06-16
  • 打赏
  • 举报
回复
要避免内存碎片,最好的办法就是采用内存池,否则不可避免
chenjiawei007 2011-06-16
  • 打赏
  • 举报
回复
内存碎片实际中遇到问题还是挺少的吧,不然你自己测试下,new后,delete() for循环+sleep(1),就算是个人版的xp也没啥事。

内存池的概念和线程池如出一折,但是线程的关闭开销和内存的new,delete差的太多啊,性能上不做大规模的并发处理并没有关系。

内存池还是看需求用吧,开多了浪费,开少了不行,没管理好容易崩溃,虽然能适当减少内存漏洞,但是带来的是内存的管理难度,并不是啥技术用了就是好。
shenyi0106 2011-06-16
  • 打赏
  • 举报
回复
内存池的作用是,一次new,多次使用,最后不用了在delete
哪来的碎片呢
qwert1643ou65923 2011-06-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shenyi0106 的回复:]
那你应该问他,你用啥子技术?顺便学习一下
[/Quote]

忘记问了。但是内存池中一样要用 new 和 delete 等。这些会产生内存碎片麽 内存碎片又是如何产生的
kyotrue 2011-06-16
  • 打赏
  • 举报
回复
你就给他说尽量少用new/delete、可以的话尽可能用局部变量就行了
帝国队长 2011-06-16
  • 打赏
  • 举报
回复
还有就是开内存的时候尽量开大一点,内存开得越小,产生的碎片越多,主要开小了回收来也不容易分出去。
shenyi0106 2011-06-16
  • 打赏
  • 举报
回复
那你应该问他,你用啥子技术?顺便学习一下
yao050421103 2011-06-16
  • 打赏
  • 举报
回复
内存池正解,其他方法太坑爹。。。
qwert1643ou65923 2011-06-16
  • 打赏
  • 举报
回复
我当时也是这样说的,说内存池,别人直接说没做过吧?。。。丢脸!
smwhotjay 2011-06-16
  • 打赏
  • 举报
回复
mempool解决!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧