我做了个测试,定时两秒,调用以下程序段。
   (1)当句1、句2、句3都调用时,没有GDI资源泄漏;
   (2)当句3与句1都不调用时,观察到每两秒只有一个GDI对象泄漏,应该是pControlDC;
   (3)当句3不调用而句1调用时,由于调用了句2,所以应该只有pControlDC泄漏,但实际上观察到每两秒都有两个GDI对象泄漏!!! 这是为什么呢?
   (4)当句1、句2、句3都不调用时,每两秒只有一个GDI对象泄漏,应该是pControlDC;这说明NewBrush可以自己释放,不一定需要调用DeleteObject。我知道正常的写法应该三句都调用,但是很奇怪(3)的情况是怎么出现的?高手请帮帮忙。void CTestDlg::Test()
{
CWnd *pWnd = GetDlgItem(IDC_STATIC1);
CDC *pControlDC=pWnd->GetDC(); CBrush NewBrush;
CBrush *pOldBrush; NewBrush.CreateSolidBrush(RGB(0,255,0));
pOldBrush = (CBrush *)pControlDC->SelectObject(&NewBrush); CRect rect;
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);
rect.OffsetRect(-rect.left, -rect.top); pControlDC->Ellipse(rect);                         //句1 pControlDC->SelectObject(pOldBrush);
if ( (HBRUSH)NewBrush ) NewBrush.DeleteObject();   //句2
pWnd->ReleaseDC(pControlDC);                       //句3
}

解决方案 »

  1.   

    pControlDC不释放,它SelectObject的不会释放
      

  2.   

    to wuchuncai:
    句2上面pControlDC->SelectObject(pOldBrush); 已经将NewBrush选出DC了呀?to kevin_wang:
    就是SetTimer(1, 2000, NULL); 
    然后OnTimer里Test();你们试试新建一个基于对话框的工程,什么都别加,就开个定时器试试,看是不是也这样。
    我是通过任务管理器看GDI资源泄漏的。
      

  3.   

    我得任务管理器没有这个功能? XP+sp2