8831|14

88

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

不死心!还是关于new delete内存碎片的问题! [复制链接]

情况一:
程序中有一个线程其中有一个死循环
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块碎片,不会有很多碎片.


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

最新回复

碎片与碎片之间的内存如果一旦得到释放,那么是否会与前后的碎片组成一段可用空间呢  详情 回复 发表于 2010-2-1 11:53
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帮顶下
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
内存碎片的问题,我也不明白


帮LZ顶下,关注学习中,期待高手指点一下
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 ialwaysgo 的回复:
内存碎片的问题,我也不明白


帮LZ顶下,关注学习中,期待高手指点一下
我也是这个意思,呵呵,学习ing…
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
说说俺的看法: 关键是N和M是动态变化的,不是固定的.否则也不需要动态申请了.
目前的内存碎片只在堆内存中存在.如果在使用堆内存时能像栈一样保证LIFO的话,自然不会产生碎片.
但是实时上,不会这样理想化的.
动态内存申请的大小一般是变化的,例如多线程网络应用中,不同情况下需要的数据(不是数据包,是数据包组成的最终数据)大小不同. 则需要内存不同. 这样多次new/delete后就会产生碎片.

 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 
俺也不懂,来学习。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
无论是否会产生内存碎片,但LZ这种申请内存的写法不好:建议内存的分配与释放不要放在循环中。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
如果一定要放在循环中,产生内存碎片是不可避免的。

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

但是,这是LZ的理想的情况,也就是说不存在多线程时。如果存在多线程时,其它线程中同时也有内存的申请与释放,这会导致内存的管理比较复杂。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

9
 
内存碎片当然是有的,这种做法很不好,尤其是申请的空间大小总是变化的情况。
为什么不在循环外new呢,在循环里面使用内存,退出的时候delete。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 7 楼 91program 的回复:
如果一定要放在循环中,产生内存碎片是不可避免的。

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

但是,这是LZ的理想的情况,也就是说不存在多线程时。如果存在多线程时,其它线程中同时也有内存的申请与释放,这会导致内存的管理比较复杂。
学习,学习…
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
问题不大 各系统实现不同 但是可以参考LInux的内存管理
系统会把不同大小范围之内的内存块分几个列表来管理 零散的碎片没什么问题
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

12
 
顶上去
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

13
 
会产生内存碎片,因为WinCE的内存管理与Windows的内存管理不一样,WinCE中默认堆不能对碎片进行移动管理。因此如果要频繁申请、删除内存最好使用独立堆,而不使用默认堆。独立堆是开辟在slots33-63之中,函数名可以上网查查。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 6 楼 91program 的回复:
无论是否会产生内存碎片,但LZ这种申请内存的写法不好:建议内存的分配与释放不要放在循环中。

我知道为什么不要放到循环中了呵呵。
因为你new是在循环的开始,delete是在循环的最后。
但是如果你的其他线程中调用TerminateThread()函数强制退出线程。就是中间退出循环的话就不能delete了。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

15
 
碎片与碎片之间的内存如果一旦得到释放,那么是否会与前后的碎片组成一段可用空间呢
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表