这几天被资源泄漏整的很惨!!

xiaoakang 2007-02-10 03:31:24
CClientDC dc(this);

if(m_pMemDC->GetSafeHdc())
return FALSE;

if(!m_pMemDC->CreateCompatibleDC(&dc))
return FALSE;

CBitmap bmp;
if(!bmp.CreateCompatibleBitmap(&dc, m_rcClient.Width(), m_rcClient.Height()))
return FALSE;
//oldbitmap = (CBitmap*)m_pMemDC->SelectObject(bmp);
if(!m_pMemDC->SelectObject(bmp))
return FALSE;

//Set the background color of the control
CBrush bkBrush;
if(!bkBrush.CreateSolidBrush(m_crBackGround))
return FALSE;

m_pMemDC->FillRect(m_rcClient, &bkBrush);

//Select a specified pen to the device context to draw background lines
CPen bkLinesPen;
if(!bkLinesPen.CreatePen(PS_SOLID, 1, m_crGrids))
return FALSE;
//oldpen = (CPen*)m_pMemDC->SelectObject(bkLinesPen);
if(!m_pMemDC->SelectObject(bkLinesPen))
return FALSE;

//Draw background lines
for(register i = m_rcClient.left - 1; i < m_rcClient.right; i += 13)
{//画竖的网格线,间隔为13个象素
m_pMemDC->MoveTo(i, m_rcClient.top);
m_pMemDC->LineTo(i, m_rcClient.bottom);
}

for(register j = m_rcClient.top - 1; j < m_rcClient.bottom; j += 13)
{//画横的网格线,间隔为13个象素
m_pMemDC->MoveTo(m_rcClient.left, j);
m_pMemDC->LineTo(m_rcClient.right, j);
}

m_yPreviousPos = m_yPos = m_rcClient.bottom + 1;
InvalidateRect(m_rcClient);
return TRUE;


以上是我的一个函数里的程序,请问是不是有资源泄漏啊?该怎么处理?
...全文
265 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanilyer 2007-02-10
  • 打赏
  • 举报
回复
你可以将bmp 设置为成员变量在构造函数中初始化它

也就是将下面调用放入构造函数中
if(!bmp.CreateCompatibleBitmap(&dc, m_rcClient.Width(), m_rcClient.Height()))
return FALSE;

然后在析构函数中在删除bmp
xiaoakang 2007-02-10
  • 打赏
  • 举报
回复
上面oldbmp = (CBitmap*)m_pMemDC->SelectObject(bmp);漏了&
应为 oldbmp = (CBitmap*)m_pMemDC->SelectObject(&bmp);

这样图就画不出来了,空白的。
如果这样该怎么删除bmp对象?
xiaoakang 2007-02-10
  • 打赏
  • 举报
回复
wanilyer还真行啊!

不过发现一个另问题

如果:oldbmp = (CBitmap*)m_pMemDC->SelectObject(bmp);
.....
.....
Invalidate();
(CBitmap*)m_pMemDC->SelectObject(oldbmp);
bmp.DeleteObject();
这样一来图就画不出来了。
???真的郁闷死了
wanilyer 2007-02-10
  • 打赏
  • 举报
回复
oldpen = (CPen*)m_pMemDC->SelectObject(bkLinesPen);

把这句改成

oldpen = (CPen*)m_pMemDC->SelectObject( &bkLinesPen );
xiaoakang 2007-02-10
  • 打赏
  • 举报
回复
楼上的说得有道理
但,问题在于我没有将bmp从m_pMemDC选出来之前我没法将bmp deleteObject掉啊,
而我问题的症结刚好就在于 m_pMemDC->SelectObject(oldpen);这句,这句话就是想把原来选进去的GDI选出来啊

不知道我说的对不?
livedeal 2007-02-10
  • 打赏
  • 举报
回复
还有就是bmp没有deleteobject掉~
xiaoakang 2007-02-10
  • 打赏
  • 举报
回复
我的程序时间跑长了,原来画的图就变得面目全非了!请教一下大侠!
据说是资源泄漏的问题,需要将用到的GDI对象最后DeleObject(),可问题是像上面这个应当如何处理?
我试着想这样做:(比如对于CPen bkLinesPen)
我改写如下
CPen bkLinesPen,*oldpen;
if(!bkLinesPen.CreatePen(PS_SOLID, 1, m_crGrids))
return FALSE;
oldpen = (CPen*)m_pMemDC->SelectObject(bkLinesPen);
if(!oldpen)
return FALSE;
....
....
//函数退出前
m_pMemDC->SelectObject(oldpen);//将原来的选回去
bkLinesPen.DeleteObject();//然后将GDI对象调用DeleteObject()
可是程序总在m_pMemDC->SelectObject(oldpen);这句话处出错,好像是oldpen没法选回去似的,请问是怎么回事?这样以来我该怎么释放资源内存?

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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