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