void CTestDlg::OnButton1()
{
  CBrush brush;
  brush.CreateSolidBrush(RGB(255,0,255));
  brush.DeleteObject();
}

解决方案 »

  1.   

    Release版,GDI个数使用任务管理器查看。
      

  2.   

    brush.DeleteObject()是多余的,CBrush类在析构的时候会自动Delete,不过自己Delete也没有什么影响。
    这段代码不会有泄露,你可以试一下连续点这个按钮,GDI句柄数不会一直增加,不清楚任务管理器是根据什么来显示的,把这几行代码改成::CreateSolidBrush和::DeleteObject也是一样。
      

  3.   

    这个代码应该没有问题啊。DeleteObject调用是正确的。当资源不再需要使用时,即使时临时变量,调用合适的删除语句也是应该的,不要等待函数的自动回收。否则同一函数后面的语句再申请内存时肯定会有影响。
    也许根本没有泄露,可能是任务管理器未能实时的刷新GDI数量吧。
      

  4.   

    Create出来的gdi对象,一定要用DeleteObject来释放,释放顺序是先Create的后释放,后Create的先释放.你这个感觉没啥问题
      

  5.   

    看看这一段,就知道泄露多少个了。我觉得brush.DeleteObject();之后,仍有一个HGDIObject的句柄没有释放。CBrush brush;
    brush.CreateSolidBrush(RGB(0xff,0x00,0x00));
    brush.DeleteObject();
    brush.CreateSolidBrush(RGB(0xff,0x00,0x11));
    brush.DeleteObject();
    brush.CreateSolidBrush(RGB(0xff,0x00,0x22));
    brush.DeleteObject();
    brush.CreateSolidBrush(RGB(0xff,0x00,0x33));
    brush.DeleteObject();
    brush.CreateSolidBrush(RGB(0xff,0x00,0x44));
    brush.DeleteObject();
      

  6.   

    这个句柄指向一个特定的brush,比如0xff,0x00,0xff的刷子。
      

  7.   

    void CTestDlg::OnButton1()
    {
      CBrush* brush;
      brush->CreateSolidBrush(RGB(255,0,255));
      brush->DeleteObject();
      brush=NULL;
    }
    看下用指针来操作是不是要好点。
      

  8.   

    最好分开来定义了, 每个cbrush估计在其使用期结束的时候析构函数可能号要做一些事情了,呵呵!
    CBrush brush; 
    brush.CreateSolidBrush(RGB(0xff,0x00,0x00)); 
    brush.DeleteObject(); 
    CBrush brush1;
    brush1.CreateSolidBrush(RGB(0xff,0x00,0x11)); 
    brush1.DeleteObject();
    CBrush brush2; 
    brush2.CreateSolidBrush(RGB(0xff,0x00,0x22)); 
    brush2.DeleteObject();
    CBrush brush3;  
    brush3.CreateSolidBrush(RGB(0xff,0x00,0x33)); 
    brush3.DeleteObject(); 
      

  9.   

    我用搂住的代码看了一下,的确有点内存泄漏哦!然后就分开来定义了,就ok了, 而且CBruh这种类在使用的时候基本上不用deleteObject,类在析构的时候自己做了的.
      

  10.   

    问题是分开定义不是同样执行了楼主所说的那段代码?
    CBrush brush; 
    brush.CreateSolidBrush(RGB(0xff,0x00,0x00)); 
    brush.DeleteObject(); 
    我想提一句就是会不会跟这个对象名有关系brush 很像个关键字. 实在不知道为什么会泄漏.舆论..
      

  11.   

    这样呢:void CTestDlg::OnButton1() 

    CBrush brush(RGB(255,0,255)); 
    }
      

  12.   

    要看是否GDI泄漏,最好在循环中运行,然后看GDI句柄是否增加。你这样的不会泄漏。
      

  13.   

    void CTestDlg::OnButton1() 

     for(int i=0;i<10000000;i++)
      {
        CBrush brush; 
        brush.CreateSolidBrush(RGB(255,0,255)); 
        brush.DeleteObject(); 
      }
    }先看看这个是什么现象,会不会出现GDI资源枯竭?按照msdn的说法,这样做是不会有问题的,你看到的泄漏可能是表象,进程结束的时候可能会释放
      

  14.   

    LZ从任务管理器上看?那增加一两个很正常,可能是别的因素导致的,用BoundsChecker检查.
      

  15.   

    个人认为还是用BoundsChecker来看比较好。任务管理器不知道是按照什么标准来计数的。
      

  16.   

    bobob 的方法比较有效,只增长了10个左右,看样子没什么问题了。void CTestDlg::OnButton1() 

    for(int i=0;i <10000000;i++) 
      { 
        CBrush brush; 
        brush.CreateSolidBrush(COLORREF(i));
        brush.DeleteObject(); 
      } 

      

  17.   

    Release下,这段代码有用?不会被优化掉???void CTestDlg::OnButton1() 

    for(int i=0;i <10000000;i++) 
      { 
        CBrush brush; 
        brush.CreateSolidBrush(COLORREF(i)); 
        brush.DeleteObject(); 
      } 

      

  18.   


    void CTestDlg::OnButton1() 
    {
     CBrush brush; 
    for(int i=0;i <10000000;i++) 
      { 
        
        brush.CreateSolidBrush(COLORREF(i)); 
        brush.DeleteObject(); 
      } 

    你这样try 一下了,这样才和你本来要问的问题符合亚,呵呵! 
      

  19.   

    只要保证你的创建/释放操作成对就行了,你调用系统的释放函数(如DeleteObject),系统不一定会真的释放该资源,下次你再申请的时候就可以省事了,这是一种优化。