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,用不用担心它的释放? 展开
我还是不太清楚
比如我这样
HDC hdc=GetDC(hWnd);//假设有个窗口的HWND
CDC cdc;
cdc.Attach(hdc);
cdc.TextOut(0,0,"OK");
我用完了这个CDC,需不需释放什么?
再如我把一个CPen选进了一个CDC,用不用担心它的释放? 展开
展开全部
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();
如:
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();
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般的mfc类对象都是不需要释放的,类中已经在析构函数中释放了,这个不用担心。
但是如果不是使用mfc类对象,而是WinAPI建立的对象,大多数都是需要释放的,具体方式各有不同,可以去MSDN中相关函数的说明。
但是如果不是使用mfc类对象,而是WinAPI建立的对象,大多数都是需要释放的,具体方式各有不同,可以去MSDN中相关函数的说明。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你说那些都是关于GDI绘图的,
对于这些重要的就是保存好作图前的资源,一般通过
selectobject()选择与还原GDI设备,这样就保证在你的下一次作图进不影响到你原来的效果
对于这些重要的就是保存好作图前的资源,一般通过
selectobject()选择与还原GDI设备,这样就保证在你的下一次作图进不影响到你原来的效果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
凡动态分配了存储单元的变量,一旦不用,就要释放。
例如动态数组,不管用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;
泄漏,没找到毛病所在,觉得复杂,找到了,觉得如此简单。
例如动态数组,不管用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;
泄漏,没找到毛病所在,觉得复杂,找到了,觉得如此简单。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询