不死心!还是关于new delete内存碎片的问题!

hero362631780   2010-1-30 21:54 楼主
情况一:
程序中有一个线程其中有一个死循环
while(1)
{
  new (n)
......
....
.....
  delete (n)
}
n大小不定
这样的一个程序会产生内存碎片吗?每次都及时释放了,然后再申请,还能产生碎片吗?
情况二:
程序中有2个线程序其中有二个死循环
while(1)
{
  new (n)
......
....
.....
  delete (n)
}

while(2)
{
  new (m)
......
....
.....
  delete (m)
}
m,n大小不定

假设运行时候线程1中申请了10KB 线程2申请了20KB 然后线程1运行完毕并释放10KB 接着又开始申请30KB,那么之前释放的10KB就成内存碎片了(疑问:是否是战时的),然后线程1运行完毕释放30KB,接着又申请10KB,那么这10KB是否又是在最初的10KB空间上开辟,那么之前的碎片就不存在了,其中线程2假设申请的20KB一直未动!

我觉得只要NEW 后到下次再NEW的时候释放完毕,那么产生内存碎片是不大可能的事情,就算产生也只是1块碎片,不会有很多碎片.


望高手能详细解答一下!!!我就是不明白,可能是苯了点,但是我不死心,想搞搞清楚!!!谢谢!!!

回复评论 (14)

帮顶下
点赞  2010-1-30 22:21
内存碎片的问题,我也不明白


帮LZ顶下,关注学习中,期待高手指点一下
点赞  2010-1-30 22:29
引用: 引用 2 楼 ialwaysgo 的回复:
内存碎片的问题,我也不明白


帮LZ顶下,关注学习中,期待高手指点一下
我也是这个意思,呵呵,学习ing…
点赞  2010-1-31 06:10
说说俺的看法: 关键是N和M是动态变化的,不是固定的.否则也不需要动态申请了.
目前的内存碎片只在堆内存中存在.如果在使用堆内存时能像栈一样保证LIFO的话,自然不会产生碎片.
但是实时上,不会这样理想化的.
动态内存申请的大小一般是变化的,例如多线程网络应用中,不同情况下需要的数据(不是数据包,是数据包组成的最终数据)大小不同. 则需要内存不同. 这样多次new/delete后就会产生碎片.

点赞  2010-1-31 08:39
俺也不懂,来学习。
点赞  2010-1-31 08:55
无论是否会产生内存碎片,但LZ这种申请内存的写法不好:建议内存的分配与释放不要放在循环中。
点赞  2010-1-31 22:16
如果一定要放在循环中,产生内存碎片是不可避免的。

内存的分配,如果按LZ的分配与释放的顺序,是不太可能产生内存碎片的。已释放的内存,如果能满足下次内存申请的需要,肯定是会被重新利用的。

但是,这是LZ的理想的情况,也就是说不存在多线程时。如果存在多线程时,其它线程中同时也有内存的申请与释放,这会导致内存的管理比较复杂。
点赞  2010-1-31 22:21
内存碎片当然是有的,这种做法很不好,尤其是申请的空间大小总是变化的情况。
为什么不在循环外new呢,在循环里面使用内存,退出的时候delete。
点赞  2010-1-31 22:50
引用: 引用 7 楼 91program 的回复:
如果一定要放在循环中,产生内存碎片是不可避免的。

内存的分配,如果按LZ的分配与释放的顺序,是不太可能产生内存碎片的。已释放的内存,如果能满足下次内存申请的需要,肯定是会被重新利用的。

但是,这是LZ的理想的情况,也就是说不存在多线程时。如果存在多线程时,其它线程中同时也有内存的申请与释放,这会导致内存的管理比较复杂。
学习,学习…
点赞  2010-2-1 06:31
问题不大 各系统实现不同 但是可以参考LInux的内存管理
系统会把不同大小范围之内的内存块分几个列表来管理 零散的碎片没什么问题
点赞  2010-2-1 08:18
顶上去
点赞  2010-2-1 09:07
会产生内存碎片,因为WinCE的内存管理与Windows的内存管理不一样,WinCE中默认堆不能对碎片进行移动管理。因此如果要频繁申请、删除内存最好使用独立堆,而不使用默认堆。独立堆是开辟在slots33-63之中,函数名可以上网查查。
点赞  2010-2-1 09:15
引用: 引用 6 楼 91program 的回复:
无论是否会产生内存碎片,但LZ这种申请内存的写法不好:建议内存的分配与释放不要放在循环中。

我知道为什么不要放到循环中了呵呵。
因为你new是在循环的开始,delete是在循环的最后。
但是如果你的其他线程中调用TerminateThread()函数强制退出线程。就是中间退出循环的话就不能delete了。
点赞  2010-2-1 09:17
碎片与碎片之间的内存如果一旦得到释放,那么是否会与前后的碎片组成一段可用空间呢
点赞  2010-2-1 11:53
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复