CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

绝对经典的问题!!低手莫进!

楼主huangqishang(时光村落)2003-09-02 18:59:44 在 VC/MFC / 基础类 提问

在dos下应用程序在使用new   及delete时使用堆内存时,若分配与释放时间不当会产生大量内存碎片。而在windows中,操作系统本身有种机制,可以在空闲时移动整合一些不连续的内存碎片,使其留出最大内存块以供使用。我现在所做的系统要求实时不间断的运行(2000   server下),程序在运行中使用了大量的new和delete操作,请问高手们:windows本身能否保证真正的不产生内存碎片吗??我现在不能完全确信这一点,请各位指点!! 问题点数:0、回复次数:26Top

1 楼flyelf(空谷清音)回复于 2003-09-02 19:10:36 得分 0

可以自己写一个内存池来自己进行分配Top

2 楼syl5005(syl5005)回复于 2003-09-02 19:11:14 得分 0

本来大家还想要进来看一看的,你却---低手莫进!这样不好!!!  
  你的问题是有难度,只有微软自己的人才好说清楚,对不起,我也不懂。Top

3 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-02 19:11:45 得分 0

:windows本身能否保证真正的不产生内存碎片吗?  
  不能  
  Top

4 楼tonybaobao(Tony宝宝)回复于 2003-09-02 19:16:58 得分 0

即使是NTFS也会产生文件碎片,只不过有大有小而已。所以,如果你的程序会使new操作无法正常进行的话,那首先应该考虑改进你的程序和算法!Top

5 楼huangqishang(时光村落)回复于 2003-09-02 19:28:06 得分 0

我的这个程序要求实时性很高,而且该程序不能中断,我担心运行半年甚至一年后会导致过多的内存碎片而使系统瘫痪!我不是十分确信windows是否真正的有这种内存片的移动机制。如果有,我就不用担心了,我就害怕它没有!Top

6 楼awnucel(西大耻犹未雪,南京恨何时灭&抵制日货)回复于 2003-09-02 19:30:11 得分 0

你的担心恐怕是成立的Top

7 楼Portege2010(不高兴)回复于 2003-09-02 19:35:45 得分 0

事实上,内存是以4k为一个页,386cpu的分页机制将以4K为单位的不连续不规则的内存片段映谢成线性地址,使得程序看以来他们是连续的.  
   
  事实上,在物理内存中是不可能连续的.Top

8 楼wkgenius()回复于 2003-09-02 19:39:13 得分 0

Windows应该是不能保证不产生内存碎片,不过应该不会对你的程序产生影响,我以前写过一个频繁的调用new和delete的程序,就没有任何问题。Top

9 楼everandforever(Forever)回复于 2003-09-02 19:41:05 得分 0

如果要运行一年半载的话,不如写个缓存池Top

10 楼piggybank(吞硬币的小猪)回复于 2003-09-02 19:42:11 得分 0

awnucel(三十功名臣与土※八千里路云和月)(峰宸)   (   )   信誉:97     2003-09-02   19:30:00     得分:0    
     
     
      你的担心恐怕是成立的  
       
  _______________________________________________  
  如果你觉得有必要的话,  
  _______________________________________________    
  回复人:   flyelf(空谷清音)   (   )   信誉:100     2003-09-02   19:10:00     得分:0    
     
     
      可以自己写一个内存池来自己进行分配  
       
     
  Top

11 楼howtotell(从何谈起)回复于 2003-09-02 19:56:36 得分 0

char*   buf;  
  for(;;)  
  {  
  buf=new   char[10240];  
  delete   buf;  
  }  
  这样的程序也不会崩溃的。Top

12 楼tolixiaohui()回复于 2003-09-02 20:24:48 得分 0

有没有碎片,你根本就不用关心,操作系统会处理的  
  windows   作的相当完善了,  
  只要不是   漏洞!Top

13 楼sakurar(开发者绝不是好玩家)回复于 2003-09-02 20:34:05 得分 0

用内存池。  
  不论从性能还是稳定性考虑,自己管理内存才是明智的。Top

14 楼huangqishang(时光村落)回复于 2003-09-02 20:39:05 得分 0

如果分配和释放是适当的,肯定不会有的。这我知道,但我程序的分配和释放的是不确定的,  
  比如:  
  while(1)  
  {  
          char   *buf1   =   new   char[8000];  
          char   *buf2   =   new   char[20];  
          delete   []buf2;  
          delete   []buf1;  
  }  
  若在单线程中执行上段程序绝对不会有内存碎片。因为后分配的先释放。但我的程序是多线程,而且即使在同一线程中,也没能完全保证如上述代码一样。比如有下列情况发生(会有碎片先分配先释放):  
  while(1)  
  {  
          char   *buf1   =   new   char[8000];  
          char   *buf2   =   new   char[20];  
          delete   []buf1;  
          delete   []buf2;  
  };  
  上面这段代码就会产生碎   片了。更何况我是多个线程都在new和delete呢??其实我只是想  
  知道windows操作系统有没有真正的的这种机制,在空闲时把内存碎片组合到一起??我想有一部分朋友还没有真正明白我所问的这个问题的实质。  
   
  Top

15 楼huangqishang(时光村落)回复于 2003-09-02 20:57:34 得分 0

我还想问大家,如果要做内存池,应该如何做?我原来没有做过这种东西。而且做内存池后,我的程序修改量会不会很大?请高手们指点!Top

16 楼fish1976(fish1976)回复于 2003-09-02 20:58:48 得分 0

我觉得这个问题和已明确的告诉你,在c++下使用new   malloc,windows   不会给你回收内存的,所以对于内存泄露,还是自己解决吧!Top

17 楼dzqsuper(数风流人物-还看打倒日本猪的人(抵制日货))回复于 2003-09-02 21:05:33 得分 0

我是低手  
  但是我进来了  
  你能拿我怎么着吧Top

18 楼cryincold(夜来☆幽梦忽还【湘】)回复于 2003-09-02 21:13:15 得分 0

呵~~我是低手中的高手,高手中的低手。我究竟是只什么手哩?Top

19 楼huangqishang(时光村落)回复于 2003-09-02 21:19:02 得分 0

我觉得我的问题够明确了,可是fish1976居然还误解我?让我难过呀。。。:)我说的不是内存泄露,而是内存碎片!!内存泄露我肯定保证在我程序里是不会有的。还有那位dzqsuper,真的让我看到你的  
  "我是低手   但是我进来了   你能拿我怎么着吧"后大笑了一番哟。。。真够幽默的哟。其实大家只是在一起交流而已,我希望所有的不管高手低手,都互相学习。我也是低手哟。。。。问题之所以这个名字,是为了"吸引"大家。哈哈。。。并无他意!  
  Top

20 楼windbells(风铃)回复于 2003-09-02 21:31:47 得分 0

to     cryincold(梦里幽梦忽还【湘】☆★☆★)    
  俺知道   是扒手。Top

21 楼Analyst()回复于 2003-09-02 21:50:06 得分 0

从逻辑地址空间上来说频繁的分配释放必然产生内存碎片,系统也无法将这些碎片在逻辑地址空间上合并,否则你的指针就失效了。用GC机制的话到可以消除碎片,在每次清扫之后,GC会把分配的内存空间合并。从物理内存上来说就更加不连续了,内存单元以4K为一个分页,分页可能在物理内存里也可能在硬盘上,这个是由系统来管理的,这里有没有碎片已经无关紧要了。Top

22 楼nonocast(如果没有如果)回复于 2003-09-02 21:54:45 得分 0

自己管理内存  
  呵呵  
  如果可以的话  
  可是...Top

23 楼asign(局外人@http://blog.csdn.net/asign)回复于 2003-09-02 21:56:13 得分 0

markTop

24 楼jjqiao710102(aqiao)回复于 2003-09-02 22:01:14 得分 0

自已管理内存较好!  
  Top

25 楼echoher(Est Sularus oth Milthas)回复于 2003-09-02 22:13:36 得分 0

sgi   stl中对于小的内存(128字节一下)会用二级分配机制,就是内存池  
   
  loki库中也有类似的机制,推荐看看源码  
   
  侯捷的《stl源码刨析》第二章有详细解释Top

26 楼huangqishang(时光村落)回复于 2003-09-02 22:23:36 得分 0

我手头没有<sstl源码刨析>,我想知道内存池的实现方法,哪位高手可否指点?Top

相关问题

  • 低手莫入!!
  • 绝对经典
  • 绝对困难的问题,低手免进
  • 绝对困难的问题,低手免进
  • 文章上传问题(低手莫进)
  • 巨牛问题,低手莫进!
  • 低手莫入!SQL 语法解析?
  • 绝对英文经典
  • 请x_qiang(绝对低手) 和agui(阿贵) 来接分(我还有个问题啊)~~~
  • 有关iis中协议的设置的问题!低手莫入!!!!!!!!!!!!

关键词

  • 内存
  • 物理
  • 系统
  • 低手
  • 碎片
  • 程序
  • 分配
  • 机制
  • 分页
  • 释放

得分解答快速导航

  • 帖主:huangqishang

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo