mfc中的资源释放问题

我刚学mfc,里面有很多对象我不知道需不需释放,怎么释放,如CPen,CDC,CBrush,CFont......请详细说说。我还是不太清楚比如我这样HDChdc=Get... 我刚学mfc,里面有很多对象我不知道需不需释放,怎么释放,如CPen,CDC,CBrush,CFont......请详细说说。
我还是不太清楚
比如我这样
HDC hdc=GetDC(hWnd);//假设有个窗口的HWND
CDC cdc;
cdc.Attach(hdc);
cdc.TextOut(0,0,"OK");
我用完了这个CDC,需不需释放什么?

再如我把一个CPen选进了一个CDC,用不用担心它的释放?
展开
 我来答
seafox217
2008-02-25 · TA获得超过253个赞
知道答主
回答量:34
采纳率:0%
帮助的人:64.6万
展开全部
CPen、CBrush或Cfont等一般通过CreateXXX()来建立,
如:
CPen pen;
pen.CreatePen(...);
如果再次调用CreatePen(...);前没有用pen.DeleteObject();则会出错.

CDC的话
建议释放对象cdc;
用ReleaseDC(&cdc);
我记得以前有个程序没有释放,结果打开任务管理器,看到程序所占内存不断在增,释放后就解决了。

补充:

理论我知道的不多,我还是举例说下自己的感觉:
假设你把这段代码写到了一个按钮事件里,如:
OnButton1(){
HDC hdc=GetDC(hWnd);
CDC cdc;
cdc.Attach(hdc);
cdc.TextOut(0,0,"OK");
}
没有释放cdc,那么你运行程序,打开任务管理器,查看你程序进程,然后猛点那个按钮,你应该会看到内存占用在不断增加,如果释放了应该就不会出现这样的情况,这个是我碰到的情况,至于不释放会不会有其他情况我也不太清楚.

对于像CPen CBrush 等,假设有如下的代码:
CBrush br;
br.CreateSolidBrush(RGB(0,0,0));//黑色刷子
...
br.DeleteObject();//释放br
br.CreateSolidBrush(RGB(255,0,0));//红色刷子
...
br.DeleteObject();//释放br
如果不释放掉那个黑色的刷子,运行br.CreateSolidBrush(RGB(255,0,0));一句来创建红色刷子时会出错.应该就是没有释放掉黑色刷子导致的.当然你可以用两个CBrush对象br1,br2.
但还是建议用完后用个DeleteObject();
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6452b3628
2008-02-22 · TA获得超过1.7万个赞
知道大有可为答主
回答量:4881
采纳率:0%
帮助的人:5341万
展开全部
一般的mfc类对象都是不需要释放的,类中已经在析构函数中释放了,这个不用担心。
但是如果不是使用mfc类对象,而是WinAPI建立的对象,大多数都是需要释放的,具体方式各有不同,可以去MSDN中相关函数的说明。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xjc_cd
2008-02-22 · TA获得超过413个赞
知道小有建树答主
回答量:445
采纳率:0%
帮助的人:437万
展开全部
你说那些都是关于GDI绘图的,

对于这些重要的就是保存好作图前的资源,一般通过
selectobject()选择与还原GDI设备,这样就保证在你的下一次作图进不影响到你原来的效果
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
朱曾巫马雅霜
2019-01-10 · TA获得超过3850个赞
知道大有可为答主
回答量:3066
采纳率:28%
帮助的人:235万
展开全部
凡动态分配了存储单元的变量,一旦不用,就要释放。
例如动态数组,不管用new,还是
malloc分配的。就要
delete

free.
这点,你会注意的。
但mfc程序有些地方
动态分配存储单元
对程序员来说,不能“明显看出”。
由于mfc程序是事件驱动程序,有许多子程序(函数)是不断循环执行的。这些
不能“明显看出”的
动态分配,正因为不会自动释放,
才会引起泄漏。
例如
cview
ondraw()里,如果你
建了一个
font,
"画"
完字,不用了,就要释放。
cfont
font;
font.createfontindirect(&lf);
//
这个过程隐含了分配
....
deleteobject(font);
//
不用了,就要释放
例如,
调色盘
logpalette
*plp
=
(logpalette
*)
new
byte[nsize];
....
delete[]
plp;
//
不用了,就要释放
例如,
句柄
handle
hdib
=
ddbtodib(
bitmap,
bi_rgb,
&pal
);
//
这个过程隐含了分配
....
globalfree(
hdib
);
//
不用了,就要释放
mfc程序比较复杂,你的泄漏是怎样引起的,要自己查找。上次有位提问的朋友,就是
cfont
font;
泄漏,没找到毛病所在,觉得复杂,找到了,觉得如此简单。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式