超难题:为什么在Win98下,频繁的使用CreatePen,DeleteObject,SelectObject会出现资源泄漏!?

ccnuxjg 2002-11-25 05:22:25
在98下,在OnTimer里面使用下面的函数会有资源泄漏,为什么呀。
void DrawGraphyClass::DrawGraphy ( CDC *pDC, const int _InputRate )
{

CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC ( pDC );

static width = m_DisplayRect.right - m_DisplayRect.left;
static height = m_DisplayRect.bottom - m_DisplayRect.top;
MemBitmap.CreateCompatibleBitmap ( pDC, width, height );

CBitmap *pOldBit=(CBitmap *)MemDC.SelectObject(&MemBitmap);
ASSERT (pOldBit != NULL);

MemDC.FillSolidRect (0, 0, width, height, RGB(0, 0, 0));
CPen pen,pen2;
CPen *OldPen;
pen.CreatePen(PS_SOLID, 1, m_GridColor ) ;
OldPen = (CPen *)MemDC.SelectObject(&pen);

static int count = 0;
count ++;
int _Interval = m_nInterval / m_nTimes;
for ( int i = 1; i <= m_nHorNum; i++ )
{
MemDC.MoveTo ( 0, i * m_nInterval );
MemDC.LineTo ( m_DisplayRect.right - m_DisplayRect.left, i * m_nInterval );
}
for ( int j = 1; j <= m_nColNum; j++ )
{
count = count % m_nTimes;
MemDC.MoveTo ( j * m_nInterval - count * _Interval, 0 );
MemDC.LineTo ( j * m_nInterval - count * _Interval, m_DisplayRect.bottom - m_DisplayRect.top );
}

MemDC.SelectObject ( OldPen );
pen.DeleteObject();

pen2.CreatePen (PS_SOLID, 1, m_LineColor );
OldPen = (CPen *)MemDC.SelectObject ( &pen2 );

float _fTempInterval = static_cast<float> ( m_DisplayRect.bottom - m_DisplayRect.top ) / 100 ;
int _yPos = static_cast<int> ( m_DisplayRect.bottom - m_DisplayRect.top - _InputRate * _fTempInterval + 0.5 );

std::list<CPoint>::iterator it;

if ( m_PointList.size() < m_nTotalNum )
{
m_PointList.push_back ( CPoint ( m_DisplayRect.right - m_DisplayRect.left, _yPos ) );
}
else
{
m_PointList.push_back ( CPoint ( m_DisplayRect.right - m_DisplayRect.left, _yPos ) );
m_PointList.pop_front ();
}
for ( it = m_PointList.end(); it != m_PointList.begin(); it-- )
{
it->x = it->x - _Interval;
}
it->x = it->x - _Interval;
int n=0;
for ( it = m_PointList.end(), n=0, it--; it != m_PointList.begin() && n<= m_PointList.size(); it--, n++ )
{
CPoint _tempPoint = *it;
CPoint _TempPoint = *--it;
it++;
MemDC.MoveTo ( _tempPoint );
MemDC.LineTo ( _TempPoint );
}


pDC->BitBlt ( m_DisplayRect.left, m_DisplayRect.top, m_DisplayRect.right-m_DisplayRect.left, m_DisplayRect.bottom-m_DisplayRect.top, &MemDC, 0, 0, SRCCOPY );
MemDC.SelectObject ( OldPen);
pen2.DeleteObject();

MemDC.SelectObject(pOldBit);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
...全文
56 点赞 收藏 25
写回复
25 条回复
ccnuxjg 2002年11月27日
DeleteObject(*pOldBit);//你忘了删除它了

这句话需要吗?
回复 点赞
ccnuxjg 2002年11月27日
我在Codeguru.com上问了问,有个印度人回答了,可是他的方法仍然不行。

http://www.codeguru.com/forum/showthread.php?threadid=220179

回复 点赞
romanticist 2002年11月27日
DeleteObject(pen);
DeleteObject(pen2);
DeleteObject(*OldPen);

DeleteDC(MemDC);
DeleteObject(MemBitmap);
DeleteObject(*pOldBit);//你忘了删除它了

回复 点赞
HuWenjin 2002年11月27日
没有问题


你认了吧
回复 点赞
HuWenjin 2002年11月26日
再次仔细看过你的这段代码,问题应不会是出在这里,查查其它地放吧
回复 点赞
nbgyf 2002年11月26日
近日较忙,忘了帮您测试,Sorry!

今晚测
回复 点赞
ccnuxjg 2002年11月26日
来人啦!
回复 点赞
ccnuxjg 2002年11月26日
UP
回复 点赞
ccnuxjg 2002年11月26日
void CTestDlg::OnTimer(UINT nIDEvent)
{
int rate = 100 * static_cast<float>(rand()) / RAND_MAX;

int rate1 = 100 * static_cast<float>(rand()) / RAND_MAX;

CDC *pDC = GetDC ();
m_Draw.DrawGraphy ( pDC, rate );
ReleaseDC ( pDC );


CDialog::OnTimer(nIDEvent);
}
回复 点赞
xf8zbf 2002年11月26日
把你OnTimer完整的调用贴出来才好分析吗。
回复 点赞
sunheart 2002年11月26日
gz
回复 点赞
ccnuxjg 2002年11月26日
各位是怎么解决的呀!?
回复 点赞
freekany2002 2002年11月25日
这里找不到答案吗?来这里试试看!
这里有问必答
http://systemer.51.net/cgi-bin/leoboard.cgi
希望你能在这里找到你满意的答案
回复 点赞
fengyunjian 2002年11月25日
任何设备不能DELETE
只能RELEASE()
回复 点赞
riverboat 2002年11月25日
gz
回复 点赞
RomanticProgrammer 2002年11月25日
xuexi
回复 点赞
HuWenjin 2002年11月25日
DeleteObject 不一样

在98下如果没有选回去就不能 delete 但在 2000 下可以吧

没有证实的
回复 点赞
YP2002CN 2002年11月25日
我也不太清楚具體問題.也沒有看你的程序.大致認為是掉用GDI對象的.
這裡有個現象你也許可以參考..或者是你值得研究的東西
首先xp.2000畢竟和98是存在很大的不同的...
在98下你這樣掉用很可能產生GDI的錯誤.而且
你在你的Debug(98裡面)很容易看到GDI.dll***: Cx0000005..之類的調試信息.
掉用GDI對象需要注意很多地方.你可以參照下面這個網頁面.
http://msdn.microsoft.com/msdnmag/issues/01/03/leaks/default.aspx
對於cx000005等的信息.其實是微軟的一個良性的bug.詳細的請看
http://support.microsoft.com/default.aspx?scid=KB;en-us;q233390
正如Saimen所說..應該保存原來的GDI對象.用完後,給取回.
我上面說的.也許不對..等你找到答案..我再來看看.
我的一個同事也在這裡好像做了一個類似的東西.就是出現洩漏.包括GDI的.但是他沒有解決
回复 点赞
jason_sun22 2002年11月25日
我也遇到这种问题:
创建、选入、使用、选回、删除。

过程没问题,但是资源好像释放不掉。。Faint。。
回复 点赞
ccnuxjg 2002年11月25日
而且,我仔细的看了程序,没有发现没有选回去的问题。
回复 点赞
发动态
发帖子
VC/MFC
创建于2007-09-28

7889

社区成员

42.1w+

社区内容

VC/MFC相关问题讨论
社区公告
暂无公告