对于GDI资源泄露的一些疑问,欢迎大家指教!

lixiaoxin1989 2016-06-24 09:25:40
我用MFC封装的GDI对象进行绘图,程序运行一段时间后会弹出“所需的资源不可用”的错误。网上查了原因,大致是因为在DC.SelectObject()后没有把之前的GDI对象选择进来:

错误的代码:

CPen myPen(PS_SOLID,1,RGB(255,255,255));
DC.SelectObject(&myPen);
...


正确的代码:

CPen myPen(PS_SOLID,1,RGB(255,255,255));
CPen* OldPen = DC.SelectObject(&myPen);
...
DC.SelectObject(OldPen);


但是我还有两个疑问:
1.我响应了WM_CTLCOLOR消息,来改变控件字体:

HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: 在此更改 DC 的任何特性

//根据控件ID返回画刷
switch (pWnd->GetDlgCtrlID())
{
case IDC_STATIC1:

pDC->SelectObject(&myFont);

return (HBRUSH)GetStockObject(HOLLOW_BRUSH);
break;

default:
break;
}

// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}


这种情况下我没办法把旧的字体指针选进来,会资源泄露吗?

2.MFC封装的GDI对象析构时会调用DeleteObject(),所以不需要我显式调用。但如果CreateObject调用多次呢?

CPen myPen(PS_SOLID,1,RGB(255,255,255));
myPen.CreatePen(PS_SOLID,2,RGB(255,255,255));

这样会内存/资源泄露吗?

请大家不吝赐教,谢谢!
...全文
470 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sichuanwww 2017-07-15
  • 打赏
  • 举报
回复
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
搜“GDI泄露检测”
lixiaoxin1989 2016-06-24
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
1. MSDN上关于GetStockObject有句话:It is not necessary (but it is not harmful) to delete stock objects by calling DeleteObject. 2. 你定义的局部对象CPen,出了作用域范围,CPen类的析构函数会自己DeleteObject删除对象,所以不需要你手动显示删除~
谢谢! 1.我的问题是,在OnCtlColor()中,我对传入的pDC选择字体后就return了,没有机会把OldFont选择回去,这样会GDI资源泄露吗? 2.如果我的CPen创建了两次,在析构时会把两次创建的内存都清理掉吗?会不会泄露?
Eleven 2016-06-24
  • 打赏
  • 举报
回复
1. MSDN上关于GetStockObject有句话:It is not necessary (but it is not harmful) to delete stock objects by calling DeleteObject. 2. 你定义的局部对象CPen,出了作用域范围,CPen类的析构函数会自己DeleteObject删除对象,所以不需要你手动显示删除~
赵4老师 2016-06-24
  • 打赏
  • 举报
回复
引用 4 楼 lixiaoxin1989 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 搜“GDI泄露检测”
赵老师,泄露是一定了,现在要查哪里泄露的[/quote] https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=gdi泄露检测
lixiaoxin1989 2016-06-24
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
搜“GDI泄露检测”
赵老师,泄露是一定了,现在要查哪里泄露的

15,979

社区成员

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

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