Диалоговое окно и утечка памяти.
От: Аноним  
Дата: 17.02.05 07:41
Оценка:
У меня в приложении есть диалоговое окно(CDialog), которое получая сообщение(5 раз в секунду) рисует на CStatic битмап. Проблема следующая: если поверх этого окна пермещать любое другое окно, то начинается очень сильная утечка памяти. Происходит это, только под Windows XP? под Windows 2000 этого нет. В чем здесь может быть дело?
Re: Диалоговое окно и утечка памяти.
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 17.02.05 08:13
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>В чем здесь может быть дело?


Показывайте, как рисуете.
[ 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]: Диалоговое окно и утечка памяти.
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 17.02.05 08:32
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>
А>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]: Диалоговое окно и утечка памяти.
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 17.02.05 10:53
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Большое спасибо, проморгал.А почему это проявилось под 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]: Диалоговое окно и утечка памяти.
От: MAPCUAHUH  
Дата: 22.02.05 10:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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.
Когда прога завершает работу ОС удаляет эту область памяти. В результате утечка происходит только во время выполнения программы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.