请看一下该函数是否存在泄漏

永远爱好写程序 2009-08-13 05:12:08
我在CFormView中的OnPaint函数调用下面这个函数,控件移动触发OnPaint,刚开始没问题,运行1分钟左右时间就会出错,
好像是内存泄露了,去掉这个函数就没问题,请高手帮我看一下
BOOL CDragControlVC6View::DrawControlSelect(const CRect& rectControl,const CRect& rectControlOld,CClientDC& dcDrawSelect)
{
//CClientDC dcDrawSelect(this);
CPen pen(0,1,RGB(236,233,216));
CPen* poldpen;

CBrush* pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(236,233,216))));
poldpen=dcDrawSelect.SelectObject(&pen);
//SetROP2(dcDrawSelect,R2_XORPEN);
CRect rectSelect1(CPoint(rectControlOld.left-10,rectControlOld.top-11),CPoint(rectControlOld.left,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);
rectSelect1.SetRect(CPoint(rectControlOld.right,rectControlOld.top-11),CPoint(rectControlOld.right+10,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);
//dcDrawSelect.SelectObject(pOldBrush);


pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(255,0,0))));
CRect rectSelect(CPoint(rectControl.left-10,rectControl.top-11),CPoint(rectControl.left,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
rectSelect.SetRect(CPoint(rectControl.right,rectControl.top-11),CPoint(rectControl.right+10,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
dcDrawSelect.SelectObject(pOldBrush);
dcDrawSelect.SelectObject(poldpen);//恢复画笔
pen.DeleteObject();
return TRUE;
}
...全文
155 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pady_pady 2009-08-13
  • 打赏
  • 举报
回复
倒数第二行改为pOldBrush->DeleteObject(); //
快了点
pady_pady 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tttyd 的回复:]
pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(255,0,0))));
你的两端代码创建的画笔都没有释放,调用下面代码释放
pOldBrush->DeleteObject();
另外
pen.DeleteObject(); 不必要,pen的析构函数会释放
[/Quote]


BOOL CDragControlVC6View::DrawControlSelect(const CRect& rectControl,const CRect& rectControlOld,CClientDC& dcDrawSelect)
{
//CClientDC dcDrawSelect(this);
CPen pen(0,1,RGB(236,233,216));
CPen* poldpen;

CBrush* pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(236,233,216))));
//pOldBrush->DeleteObject();
poldpen=dcDrawSelect.SelectObject(&pen);
//poldpen->DeleteObject();
//SetROP2(dcDrawSelect,R2_XORPEN);
CRect rectSelect1(CPoint(rectControlOld.left-10,rectControlOld.top-11),CPoint(rectControlOld.left,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);
rectSelect1.SetRect(CPoint(rectControlOld.right,rectControlOld.top-11),CPoint(rectControlOld.right+10,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);

pOldBrush = dcDrawSelect.SelectObject(pOldBrush);
pOldBrush->DeleteObject();

pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(255,0,0))));
//pOldBrush->DeleteObject();
CRect rectSelect(CPoint(rectControl.left-10,rectControl.top-11),CPoint(rectControl.left,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
rectSelect.SetRect(CPoint(rectControl.right,rectControl.top-11),CPoint(rectControl.right+10,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
pOldBrush = dcDrawSelect.SelectObject(pOldBrush);
dcDrawSelect.SelectObject(poldpen);//恢复画笔

pOldBrush.DeleteObject(); //



return TRUE;
}

zgl7903 2009-08-13
  • 打赏
  • 举报
回复
CBrush* pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(236,233,216))));
pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(255,0,0))));
把语句拆散了写,不要偷懒
选入的要保留原始的句柄,使用完后恢复 创建的对象用完要删除
雪影 2009-08-13
  • 打赏
  • 举报
回复
在可能出错的地方设置断点吧,单步调式
  • 打赏
  • 举报
回复
出错时提示“必须的资源无法得到”
雪影 2009-08-13
  • 打赏
  • 举报
回复
这里也没看到什么资源泄漏啊
你通过任务管理器查看GDI对象的变化,看看有无什么异常?
观察进程的内存,CPU、线程数、句柄数、GDI对象等等
  • 打赏
  • 举报
回复
调用代码 onpaint

void CDragControlVC6View::OnPaint()
{
static BOOL bDraw=FALSE;
CPaintDC dc(this); // device context for painting
CClientDC dcClient(this);


if(bDraw)
return;

bDraw=TRUE;
POSITION pos;
pos=m_arrControls.GetHeadPosition();
CWnd* pWndControl;
while(pos!=NULL)
{
pWndControl=(CWnd*)m_arrControls.GetNext(pos);
CRect rectControl;
ASSERT(pWndControl);
pWndControl->GetWindowRect(&rectControl);
ScreenToClient(&rectControl);
BOOL bIsSelected;
bIsSelected=FALSE;
CRect rectControlOld;
if(pWndControl->IsKindOf(RUNTIME_CLASS(CButton)))
{
bIsSelected=((CButtonST*)pWndControl)->m_bMySelected;
rectControlOld=((CButtonST*)pWndControl)->m_rectControlOld;
}
else if(pWndControl->IsKindOf(RUNTIME_CLASS(CEdit)))
{
bIsSelected=((CMyEditBox*)pWndControl)->m_bMySelected;
rectControlOld=((CMyEditBox*)pWndControl)->m_rectControlOld;
}
if(bIsSelected)
{//这里调用了
DrawControlSelect(rectControl,rectControlOld,dcClient);
}
if(pWndControl->IsKindOf(RUNTIME_CLASS(CButton)))
{
((CButtonST*)pWndControl)->m_rectControlOld=rectControl;
}
else if(pWndControl->IsKindOf(RUNTIME_CLASS(CEdit)))
{
((CMyEditBox*)pWndControl)->m_rectControlOld=rectControl;
}
}

pos=m_arrControls.GetHeadPosition();
while(pos!=NULL)
{
pWndControl=(CWnd*)m_arrControls.GetNext(pos);
pWndControl->Invalidate();
}
//Invalidate();
//delete pWndControl;
pWndControl=NULL;

Sleep(1);

bDraw=FALSE;

// TODO: Add your message handler code here

// Do not call CFormView::OnPaint() for painting messages
}
  • 打赏
  • 举报
回复
重新修改了一下,运行正常时间延长了一点,但还是出错
BOOL CDragControlVC6View::DrawControlSelect(const CRect& rectControl,const CRect& rectControlOld,CClientDC& dcDrawSelect)
{
//CClientDC dcDrawSelect(this);
CPen pen(0,1,RGB(236,233,216));
CPen* poldpen;

CBrush* pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(236,233,216))));
pOldBrush->DeleteObject();
poldpen=dcDrawSelect.SelectObject(&pen);
poldpen->DeleteObject();
//SetROP2(dcDrawSelect,R2_XORPEN);
CRect rectSelect1(CPoint(rectControlOld.left-10,rectControlOld.top-11),CPoint(rectControlOld.left,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);
rectSelect1.SetRect(CPoint(rectControlOld.right,rectControlOld.top-11),CPoint(rectControlOld.right+10,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);


pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(255,0,0))));
pOldBrush->DeleteObject();
CRect rectSelect(CPoint(rectControl.left-10,rectControl.top-11),CPoint(rectControl.left,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
rectSelect.SetRect(CPoint(rectControl.right,rectControl.top-11),CPoint(rectControl.right+10,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
dcDrawSelect.SelectObject(pOldBrush);
dcDrawSelect.SelectObject(poldpen);//恢复画笔

return TRUE;
}
Fireway2008 2009-08-13
  • 打赏
  • 举报
回复
pOldBrush->DeleteObject();
改为:
DeleteObject((HBRUSH)pOldBrush);


或者用CBrush* pOldBrush-》 HBRUSH hbr;

但是你已经选回了他,应该不是这个问题吧。
你怎么知道有泄漏的?
雪影 2009-08-13
  • 打赏
  • 举报
回复
会不会是在其他的地方呢?
贴调用DrawControlSelect函数的代码
  • 打赏
  • 举报
回复
修改后代码
BOOL CDragControlVC6View::DrawControlSelect(const CRect& rectControl,const CRect& rectControlOld,CClientDC& dcDrawSelect)
{
//CClientDC dcDrawSelect(this);
CPen pen(0,1,RGB(236,233,216));
CPen* poldpen;

CBrush* pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(236,233,216))));
poldpen=dcDrawSelect.SelectObject(&pen);
//SetROP2(dcDrawSelect,R2_XORPEN);
CRect rectSelect1(CPoint(rectControlOld.left-10,rectControlOld.top-11),CPoint(rectControlOld.left,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);
rectSelect1.SetRect(CPoint(rectControlOld.right,rectControlOld.top-11),CPoint(rectControlOld.right+10,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);
pOldBrush->DeleteObject();

pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(255,0,0))));
CRect rectSelect(CPoint(rectControl.left-10,rectControl.top-11),CPoint(rectControl.left,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
rectSelect.SetRect(CPoint(rectControl.right,rectControl.top-11),CPoint(rectControl.right+10,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
dcDrawSelect.SelectObject(pOldBrush);
dcDrawSelect.SelectObject(poldpen);//恢复画笔
pen.DeleteObject();
pOldBrush->DeleteObject();
return TRUE;
}
MoXiaoRab 2009-08-13
  • 打赏
  • 举报
回复
pOldBrush->DeleteObject();

太明显了。上面都说了,我就接分吧
  • 打赏
  • 举报
回复
加了pOldBrush->DeleteObject(); 还是不行,修改后代码如下
BOOL CDragControlVC6View::DrawControlSelect(const CRect& rectControl,const CRect& rectControlOld,CClientDC& dcDrawSelect)
{
//CClientDC dcDrawSelect(this);
CPen pen(0,1,RGB(236,233,216));
CPen* poldpen;

CBrush* pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(236,233,216))));
poldpen=dcDrawSelect.SelectObject(&pen);
//SetROP2(dcDrawSelect,R2_XORPEN);
CRect rectSelect1(CPoint(rectControlOld.left-10,rectControlOld.top-11),CPoint(rectControlOld.left,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);
rectSelect1.SetRect(CPoint(rectControlOld.right,rectControlOld.top-11),CPoint(rectControlOld.right+10,rectControlOld.top+1));
dcDrawSelect.Rectangle(rectSelect1);
pOldBrush->DeleteObject();

pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(255,0,0))));
CRect rectSelect(CPoint(rectControl.left-10,rectControl.top-11),CPoint(rectControl.left,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
rectSelect.SetRect(CPoint(rectControl.right,rectControl.top-11),CPoint(rectControl.right+10,rectControl.top+1));
dcDrawSelect.Rectangle(rectSelect);
dcDrawSelect.SelectObject(pOldBrush);
dcDrawSelect.SelectObject(poldpen);//恢复画笔
pen.DeleteObject();
return TRUE;
}
雪影 2009-08-13
  • 打赏
  • 举报
回复
pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(255,0,0))));
你的两端代码创建的画笔都没有释放,调用下面代码释放
pOldBrush->DeleteObject();
另外
pen.DeleteObject(); 不必要,pen的析构函数会释放
bohut 2009-08-13
  • 打赏
  • 举报
回复
pOldBrush->DeleteObject();
雪影 2009-08-13
  • 打赏
  • 举报
回复
pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(236,233,216))));
pOldBrush->DeleteObject();
pOldBrush=CBrush::FromHandle((HBRUSH)dcDrawSelect.SelectObject(CreateSolidBrush(RGB(255,0,0))));

  • 打赏
  • 举报
回复
pen.DeleteObject(); 这个不需要吧

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧