读书人

dc-gt;selectobject(CPen)招致内存泄露

发布时间: 2013-01-08 14:02:14 作者: rapoo

dc->selectobject(CPen)导致内存泄露
void CDlgImageView::OnPaint()
{

CPen penSelect(PS_SOLID,9,RGB(0,255,0));
m_pDcImageTmp->SelectObject(&penSelect);
m_pDcImageTmp->RectangLe(....);
//m_pDcImageTmp是我new 出来的一个临时DC; 并且在OnPaint方法后面重新赋予控件DC
//m_pDcImageTmp->SelectObject(&penSelect);这句话会导致内存泄露,但是不是每次都会出现内存泄漏
我查了程序注释掉这句话,内存不会出现任何问题,但是一旦加上这句话就会出现4KB的内存泄漏(不是每次都出)
我在OnMouseMove方法中去刷新OnPaint的方法,就会出现大量的内存泄漏

}
[解决办法]
你前面不是已经select一次了吗?
m_pDcImageTmp->SelectObject(&penSelect);

[解决办法]
HPEN hOldPen=m_pDcImageTmp->SelectObject(&penSelect);
...
m_pDcImageTmp->SelectObject(hOldPen);
DeleteObject((HPOEN)penSelect);
必须恢复原来的,
否则penSelect是delete不掉的。
[解决办法]
那你pDcImageTmp对象 DeleteDC()了么?

GetDC要用ReleaseDC,对象要用DeleteDC()
[解决办法]
2楼怎么没有了?
HPEN hOldPen=(HPEN)m_pDcImageTmp->SelectObject(&penSelect);
。。。

m_pDcImageTmp->SelectObject(hOldPen);
必须恢复,否则delete不掉的。


[解决办法]
保存SelectObject返回的旧的PEN,最后SelectObject旧PEN,才能DeleteObject()
[解决办法]
m_pDcImageTmp->SelectObject(hOldPen);
penSelect.DeleteObject()
[解决办法]
马克一下,做个记号。最近也也到类似的问题。

读书人网 >VC/MFC

热点推荐