请问这个函数为什么会泄露内存,应该怎么改?

kenshu 2009-06-05 08:50:47
void MyFrame::MyFillRect(){
CBrush brushb(RGB(228,228,228));
int m_breakpoint;
CDC* hdc;
hdc = GetWindowDC();
CRect rect;
GetClientRect(&rect);
hdc->FillRect (CRect(rect.left+2 ,rect.top+2 ,rect.left + 30,rect.Height ()+2),&brushb);//画底色
brushb.DeleteObject ();
}
每调一次内存就长一点,降不下来了.

谢谢!
...全文
82 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenshu 2009-06-06
  • 打赏
  • 举报
回复
试过了,确实是这样子.
我平时只用VC写算法.

再次感谢楼上各位.

谨受教.

谢谢!
oyljerry 2009-06-05
  • 打赏
  • 举报
回复
GDI操作还是要注意对应的分配,释放的API的配对调用等
kenshu 2009-06-05
  • 打赏
  • 举报
回复
收到,谢谢楼上这么多位,先结贴,我回头试试.

谢谢!
fengrx 2009-06-05
  • 打赏
  • 举报
回复
楼主可以看看下面的文章,以后就知道怎么操作GDI了:

gdi使用经验分享
fengrx 2009-06-05
  • 打赏
  • 举报
回复
brushb可以不用释放。CBrush类的封装中已经有了吧。

Get得到的DC要Release掉。
Create得到的DC要Delete掉。

zoulie 2009-06-05
  • 打赏
  • 举报
回复
调用ReleaseDC释放 GetWindowDC获得的DC
zoulie 2009-06-05
  • 打赏
  • 举报
回复
============================
[Quote=引用楼主 kenshu 的帖子:]
void MyFrame::MyFillRect(){
CBrush brushb(RGB(228,228,228));
int m_breakpoint;
CDC* hdc;
hdc = GetWindowDC();
CRect rect;
GetClientRect(&rect);
hdc->FillRect (CRect(rect.left+2 ,rect.top+2 ,rect.left + 30,rect.Height ()+2),&brushb);//画底色
brushb.DeleteObject ();
}
每调一次内存就长一点,降不下来了.

谢谢!
[/Quote]
paerxiushi 2009-06-05
  • 打赏
  • 举报
回复
void MyFrame::MyFillRect(){
CBrush brushb(RGB(228,228,228));
int m_breakpoint;
CDC* hdc;
hdc = GetWindowDC();
CRect rect;
GetClientRect(&rect);
hdc->FillRect (CRect(rect.left+2 ,rect.top+2 ,rect.left + 30,rect.Height ()+2),&brushb);//画底色
brushb.DeleteObject ();
ReleaseDC(hdc); //GetWindowDC之后的句柄不需要时,应释放它
}
晨星 2009-06-05
  • 打赏
  • 举报
回复
MSDN中对CDC::FillRect的第二个参数有如下说明:
The brush needs to either be created using the CBrush member functions CreateHatchBrush, CreatePatternBrush, and CreateSolidBrush, or retrieved by the GetStockObject Windows function.

也就是说,不能直接使用栈上定义的CBrush对象,问题会不会出在这里?
fishion 2009-06-05
  • 打赏
  • 举报
回复
你都没用CreateXXXX怎么要用DeleteObject 了
skyxie 2009-06-05
  • 打赏
  • 举报
回复

CWnd::GetWindowDC

After painting is complete, the ReleaseDC member function must be called to release the display context.

15,979

社区成员

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

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