类似这样:
struce imageList
{
   CBitmap *bmp;
   BOOL    isuse; 
};void CreateBmp()
{
  m_Images = new imageList[300];
  for(int i = 0; i < 300; i++)
  {
     m_Images[i].bmp = new CBitmap;
     m_Images[i].bmp->CreateCompatibleBitmap(pDC, 120,120);
  }
}void AddImage(imageList *image)
{
   int iCnt = int(_msize(m_Images)/sizeof(imageList));
   imageList *tmp = new imageList[iCnt + 1];
   tmp[iCnt].bmp = image.bmp;
   tmp[iCnt].isuse = image.isuse ;   for(int i = 0; i < iCnt ; i++)
   {
     tmp[i].bmp = m_Images[i].bmp;
     tmp[i].isuse = m_Images[i].isuse;
   }
   delete[] m_Images;
   m_Images = tmp;
}
UINT DelBmp()
{
   int iCnt = int(_msize(m_Images)/sizeof(imageList));   for(int i = 0; i < iCnt; i++)
  {
     m_Images[i].bmp->DeleteObject();
  }
  delete[]m_Images;
  m_Images = NULL;
}那么不断象下面这样运行会不断产生内存碎片吗?系统会不会自动回收这些碎片?:
CreateBmp();
AddImage(image);
DelBmp();AddImage(image);
AddImage(image);
AddImage(image);DelBmp();
CreateBmp();
AddImage(image);
AddImage(image);

解决方案 »

  1.   

    我觉得会产生内存碎片,并且delete释放的内存系统也不是刚释放就收回,而是等到他用到的时候统一收回。
      

  2.   

    物理内存是分页的.
    bitmap这样的大对象(好像)是整页整页的分配的.一旦释放不会留下任何痕迹.
    堆中的CBitmap对象很小,但尺寸统一.后续的分配极大可能会重用先前释放的地址.几乎不会产生碎片.
      

  3.   

    把虚拟地址空间搞成碎片有什么关系?2GB的地址空间?真的不够你折腾?
    那你说什么事内存碎片呢,我的理解,就是new了一大堆东西,占了很多页面,又随便delete了其中的大部分,每个页面上都剩余少量的东西,导致整个页不能释放.这种情况操作系统没法做任何的优化.因为要优化就要移动堆中的东西,你的指针就没法用了.解决办法是自己管理堆.不要用FIXED标志,需要的时候lock,用完就unlock.
    但是一般没必要.
      

  4.   

    传说是这样的。
    Windows更新了这么多版,这种内存分配和回收的机制已经不知道更新多少回了,已经不清楚了。申请内存太多内存不够是经常的,但是内存太碎搞得大家心碎还没遇到过。用吧,出了问题再说,孩子哭了找他娘。
      

  5.   


    我是指楼上几位,没特指兄弟你。不过2G空间真是不够折腾的,64bit下估计才不用担心内存泄漏和碎片问题:)我遇到不止一次内存碎片,每次都是一种折磨。
      

  6.   

    很多人都会遇到碎片和泄漏问题,推荐一个微软的工具:DebugDiag,能够输出非常详细的内存分析报告。参考:
    http://blogs.msdn.com/b/tess/archive/2008/05/21/debugdiag-1-1-or-windbg-which-one-should-i-use-and-how-do-i-gather-memory-dumps.aspx