Диалоговое окно и утечка памяти.
От:
Аноним
Дата: 17.02.05 07:41
Оценка:
У меня в приложении есть диалоговое окно(CDialog), которое получая сообщение(5 раз в секунду) рисует на CStatic битмап. Проблема следующая: если поверх этого окна пермещать любое другое окно, то начинается очень сильная утечка памяти. Происходит это, только под Windows XP? под Windows 2000 этого нет. В чем здесь может быть дело?
Re: Диалоговое окно и утечка памяти.
Здравствуйте, <Аноним>, Вы писали:
А>В чем здесь может быть дело?
Показывайте, как рисуете.
[ posted via RSDN@Home 1.1.4 beta 4 r329 ]
Re[2]: Диалоговое окно и утечка памяти.
От:
Аноним
Дата: 17.02.05 08:28
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, <Аноним>, Вы писали:
А>>В чем здесь может быть дело?
SDB>Показывайте, как рисуете.
Рисуем так:
void CPreviewDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if ( lpDrawItemStruct->itemAction & ODA_DRAWENTIRE )
{
CDC *pMemDC = new CDC();
pMemDC->CreateCompatibleDC(CDC::FromHandle(lpDrawItemStruct->hDC));
bmpBig.SetBitmapBits(BUFFER_SIZE, ulBuf);
CBitmap* pOldBitmap =(CBitmap*) pMemDC->SelectObject(bmpBig);
::BitBlt(lpDrawItemStruct->hDC,0,0, IMAGE_WIDTH,IMAGE_HEGTH,pMemDC->m_hDC, 0, 0, SRCCOPY);
pMemDC->SelectObject(pb);
pMemDC->DeleteDC();
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
Re[3]: Диалоговое окно и утечка памяти.
Здравствуйте, <Аноним>, Вы писали:
А>А>CDC *pMemDC = new CDC();
А>
А где
delete pMemDC;
?
[ posted via RSDN@Home 1.1.4 beta 4 r329 ]
Re[3]: Диалоговое окно и утечка памяти.
От:
kmn
Дата: 17.02.05 08:54
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, SchweinDeBurg, Вы писали:
SDB>>Здравствуйте, <Аноним>, Вы писали:
И счего Вы взяли, что под 2K нет утечки?
насчет того, что нет delete Вам уже сказали.
хочу лишь добавить, что здесь и new не нужен.
void CPreviewDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if ( lpDrawItemStruct->itemAction & ODA_DRAWENTIRE )
{
CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
ASSERT_VALID (pDC);
CDC memDC;
memDC.CreateCompatibleDC(pDC);
bmpBig.SetBitmapBits(BUFFER_SIZE, ulBuf);
CBitmap* pOldBitmap =(CBitmap*) memDC.SelectObject(bmpBig);
::BitBlt(lpDrawItemStruct->hDC,0,0, IMAGE_WIDTH,IMAGE_HEGTH, memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
}
}
Re[4]: Диалоговое окно и утечка памяти.
От:
Аноним
Дата: 17.02.05 09:09
Оценка:
Здравствуйте, kmn, Вы писали:
kmn>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, SchweinDeBurg, Вы писали:
SDB>>>Здравствуйте, <Аноним>, Вы писали:
kmn>И счего Вы взяли, что под 2K нет утечки?
kmn>насчет того, что нет delete Вам уже сказали.
kmn>хочу лишь добавить, что здесь и new не нужен.
kmn>kmn>void CPreviewDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
kmn>{
kmn> if ( lpDrawItemStruct->itemAction & ODA_DRAWENTIRE )
kmn> {
kmn> CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
kmn> ASSERT_VALID (pDC);
kmn> CDC memDC;
kmn> memDC.CreateCompatibleDC(pDC);
kmn> bmpBig.SetBitmapBits(BUFFER_SIZE, ulBuf);
kmn> CBitmap* pOldBitmap =(CBitmap*) memDC.SelectObject(bmpBig);
kmn> ::BitBlt(lpDrawItemStruct->hDC,0,0, IMAGE_WIDTH,IMAGE_HEGTH, memDC, 0, 0, SRCCOPY);
kmn> memDC.SelectObject(pOldBitmap);
kmn> memDC.DeleteDC();
kmn> }
kmn>}
kmn>
Вот если сделать так :
CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
ASSERT_VALID (pDC);
то тогда вообще ничего не рисуется.
Насчет того , что нет утечки под Win2000 , видно системным монитром.
Re[4]: Диалоговое окно и утечка памяти.
От:
Аноним
Дата: 17.02.05 09:12
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, <Аноним>, Вы писали:
А>>А>>CDC *pMemDC = new CDC();
А>>
SDB>А где
SDB>SDB>delete pMemDC;
SDB>
SDB>?
Большое спасибо, проморгал.А почему это проявилось под WinXP, а под Win2k нет? Я наблюдал за утечкой системным монитором.
Re[5]: Диалоговое окно и утечка памяти.
Здравствуйте, <Аноним>, Вы писали:
А>Большое спасибо, проморгал.А почему это проявилось под WinXP, а под Win2k нет? Я наблюдал за утечкой системным монитором.
таскманагером что-ли? им можно отследить утечки handle, USER и GDI объектов, утечки _памяти_, а тем более место утечки — весьма проблематично, в MFC проектах надо вставлять в свои cpp
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
как в заготовках визарда и следить за окном Output при завершении приложения, в не MFC — читать
http://gzip.rsdn.ru/article/vcpp/vcdebug-5.xmlАвтор(ы): Александр Шаргин Дата: 27.01.2002
Re[5]: Диалоговое окно и утечка памяти.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, kmn, Вы писали:
kmn>>Здравствуйте, Аноним, Вы писали:
А>>>Здравствуйте, SchweinDeBurg, Вы писали:
SDB>>>>Здравствуйте, <Аноним>, Вы писали:
kmn>>И счего Вы взяли, что под 2K нет утечки?
kmn>>насчет того, что нет delete Вам уже сказали.
kmn>>хочу лишь добавить, что здесь и new не нужен.
kmn>>kmn>>void CPreviewDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
kmn>>{
kmn>> if ( lpDrawItemStruct->itemAction & ODA_DRAWENTIRE )
kmn>> {
kmn>> CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
kmn>> ASSERT_VALID (pDC);
kmn>> CDC memDC;
kmn>> memDC.CreateCompatibleDC(pDC);
kmn>> bmpBig.SetBitmapBits(BUFFER_SIZE, ulBuf);
kmn>> CBitmap* pOldBitmap =(CBitmap*) memDC.SelectObject(bmpBig);
kmn>> ::BitBlt(lpDrawItemStruct->hDC,0,0, IMAGE_WIDTH,IMAGE_HEGTH, memDC, 0, 0, SRCCOPY);
kmn>> memDC.SelectObject(pOldBitmap);
kmn>> memDC.DeleteDC();
kmn>> }
kmn>>}
kmn>>
А>Вот если сделать так :
А>А> CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
А> ASSERT_VALID (pDC);
А>
А>то тогда вообще ничего не рисуется.
А>Насчет того , что нет утечки под Win2000 , видно системным монитром.
Win2000 Когда запускает программу выделяет ей куссок памяти определённого размера.
В результате программа работает в своём адресном пространстве.В нем же выделяет память и оператор new.
Когда прога завершает работу ОС удаляет эту область памяти. В результате утечка происходит только во время выполнения программы.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить