在 WINCE 开发中使用 GDI 绘图时,碰到的内存泄露问题
2014-06-06 15:25
351 查看
大白天的见活鬼,十分的无语:
在一个 CDialog 中写了个 Timer ,Timer中有一段用 GDI 绘图的代码如下:
void WaveDlg::OnTimer(UINT_PTR nIDEvent)
{
CWnd *pWave=GetDlgItem(IDC_W***E);
CClientDC pdc(pWave);
}
很好,就这两行代码,其他的啥也没有,运行期间没有任何内存泄露。
可以注意到,我申请了一个 pdc ,并且没有去手写任何代码去释放它,因为我认为 CClientDC pdc(pWave); 这条语句所生成的对象,会在 OnTimer 函数结束时,自动析构。事实也是如此,就这两行代码,没有任何内存泄露,我特意把 Timer 的触发时间调整为 1ms,触发快,内存泄露明显,不用慢慢等。
OK,接着来,修改代码如下:
void WaveDlg::OnTimer(UINT_PTR nIDEvent)
{
CWnd *pWave=GetDlgItem(IDC_W***E);
CClientDC pdc(pWave);
CBrush brsWhite;
brsWhite.CreateSolidBrush(RGB(255,255,255));
pdc.SelectObject(brsWhite);
::DeleteObject(brsWhite.m_hObject);
}
运行,内存一“泄”千里。。。。
无奈,再次尝试,修改代码如下:
void WaveDlg::OnTimer(UINT_PTR nIDEvent)
{
CWnd *pWave=GetDlgItem(IDC_W***E);
CClientDC pdc(pWave);
CBrush brsWhite;
brsWhite.CreateSolidBrush(RGB(255,255,255));
pdc.SelectObject(brsWhite);
::DeleteObject(brsWhite.m_hObject);
::ReleaseDC(pWave->m_hWnd,pdc.m_hDC);
}
运行,不漏了。。。。
总结,在某个函数中,申请了一个局部的 CDC 后,如果,不对它进行修改,比如用它去 selectobject 某些对象,或者,不用它去画图,那么,可以不用手写代码去释放它。但是,一旦引用了这个 CDC 做了某些工作,那么,就需要手写代码去释放它了。。。
最后,为了保险起见,将所有的 CPen,CBrush 都声明为类成员,而不是局部变量,只在类成员初始化的时候,对他们调用一次 Create ,避免在局部函数中反复对他们调用 Create,避免内存泄露
在一个 CDialog 中写了个 Timer ,Timer中有一段用 GDI 绘图的代码如下:
void WaveDlg::OnTimer(UINT_PTR nIDEvent)
{
CWnd *pWave=GetDlgItem(IDC_W***E);
CClientDC pdc(pWave);
}
很好,就这两行代码,其他的啥也没有,运行期间没有任何内存泄露。
可以注意到,我申请了一个 pdc ,并且没有去手写任何代码去释放它,因为我认为 CClientDC pdc(pWave); 这条语句所生成的对象,会在 OnTimer 函数结束时,自动析构。事实也是如此,就这两行代码,没有任何内存泄露,我特意把 Timer 的触发时间调整为 1ms,触发快,内存泄露明显,不用慢慢等。
OK,接着来,修改代码如下:
void WaveDlg::OnTimer(UINT_PTR nIDEvent)
{
CWnd *pWave=GetDlgItem(IDC_W***E);
CClientDC pdc(pWave);
CBrush brsWhite;
brsWhite.CreateSolidBrush(RGB(255,255,255));
pdc.SelectObject(brsWhite);
::DeleteObject(brsWhite.m_hObject);
}
运行,内存一“泄”千里。。。。
无奈,再次尝试,修改代码如下:
void WaveDlg::OnTimer(UINT_PTR nIDEvent)
{
CWnd *pWave=GetDlgItem(IDC_W***E);
CClientDC pdc(pWave);
CBrush brsWhite;
brsWhite.CreateSolidBrush(RGB(255,255,255));
pdc.SelectObject(brsWhite);
::DeleteObject(brsWhite.m_hObject);
::ReleaseDC(pWave->m_hWnd,pdc.m_hDC);
}
运行,不漏了。。。。
总结,在某个函数中,申请了一个局部的 CDC 后,如果,不对它进行修改,比如用它去 selectobject 某些对象,或者,不用它去画图,那么,可以不用手写代码去释放它。但是,一旦引用了这个 CDC 做了某些工作,那么,就需要手写代码去释放它了。。。
最后,为了保险起见,将所有的 CPen,CBrush 都声明为类成员,而不是局部变量,只在类成员初始化的时候,对他们调用一次 Create ,避免在局部函数中反复对他们调用 Create,避免内存泄露
相关文章推荐
- Android开发中使用Handler类造成的内存泄露问题
- Android 开发使用MVP产生的内存泄露问题
- 原创: WINCE 内存泄露的检查(2) 使用Application Verifier (AppVerifier)检查资源泄漏
- 使用vs2003进行web开发的时候碰到的一些小问题
- MFC和opencv一起使用时会莫名奇妙出现内存泄露问题
- Wince内存泄露检测工具Application Verifier的使用和如何快速定位泄露语句(二)
- 使用WinDBG调试内存泄露的问题
- 使用valgrind检测内存泄露的问题。
- 【原创】回答网友关于ARM9 S3C2440 wince6.0 内存 128M的使用问题
- 使用Canvas、Bitmap时易犯的内存泄露问题
- Flex中Module的使用以及内存泄露问题解决方法
- 初次使用VS2010基于C++开发项目碰到的问题及解决方法
- 在wince上使用Silverlight开发程序受关注的问题
- iPhone开发 - 使用self. 导致的内存泄露
- 今天 使用MyEclipse 开发JSP碰到的问题!!!
- ACE 与MFC 混合使用 内存泄露问题
- QT中使用槽函数来关闭窗口,导致内存泄露的问题以及解决办法
- 关于android中使用new Message的内存泄露问题
- 在LoaderCallbacks中使用CursorAdapter造成的内存泄露问题
- 开发某WinCE MFC GDI程序中遇到的问题——bmp解析,lib,gdi