Баг CDialog + сраный MFC = утечки
От: Blabla  
Дата: 26.01.07 08:34
Оценка:
Я ниче не понимаю....
Неужели никто не замечал никогда как течет память при работе с диалогами?

Привожу пример:
1)С помощью мастера создаем проект-диалог
2)Создаем в ресурсах еще один диалог с ID=IDD_DLG2
3)На сгенерированном мастером диалоге (при создании проекта) кидаем кнопку и создаем обработчик нажатия этой кнопки
4)В обработчике этой кнопки пишем следующий код:

CDialog dlg(IDD_DLG2);
dlg.DoModal();

5)Запускаем приложение
6)Запускаем диспетчер задач, и находим наш процесс
7)Теперь в запущенном нашем приложении устанавливаем фокус на кнопку и зажимаем Enter. В результате дилог IDD_DLG2 будет появляться и исчезать, появляться и исчезать, появляться и исчезать....

8)Теперь смотрим в диспетчер задач. Память выдялемая под наш процесс постоянно УВЕЛИЧИВАЕТСЯ!

Что за хрень?
Кто нибудь может это объяснить?
И можно от этого как-нибудь избавиться?
Re: Баг CDialog + сраный MFC = утечки
От: ElcnU Россия  
Дата: 26.01.07 09:14
Оценка:
Здравствуйте, Blabla, Вы писали:

B>Я ниче не понимаю....

B>Неужели никто не замечал никогда как течет память при работе с диалогами?

B>Привожу пример:

B>1)С помощью мастера создаем проект-диалог
B>2)Создаем в ресурсах еще один диалог с ID=IDD_DLG2
B>3)На сгенерированном мастером диалоге (при создании проекта) кидаем кнопку и создаем обработчик нажатия этой кнопки
B>4)В обработчике этой кнопки пишем следующий код:

B>CDialog dlg(IDD_DLG2);

B>dlg.DoModal();

B>5)Запускаем приложение

B>6)Запускаем диспетчер задач, и находим наш процесс
B>7)Теперь в запущенном нашем приложении устанавливаем фокус на кнопку и зажимаем Enter. В результате дилог IDD_DLG2 будет появляться и исчезать, появляться и исчезать, появляться и исчезать....

B>8)Теперь смотрим в диспетчер задач. Память выдялемая под наш процесс постоянно УВЕЛИЧИВАЕТСЯ!


B>Что за хрень?

B>Кто нибудь может это объяснить?
B>И можно от этого как-нибудь избавиться?

попробуй сделать так
CDialog* dlg=new CDialog(IDD_DLG2);
dlg->DoModal();
delete dlg;
Re[2]: Баг CDialog + сраный MFC = утечки
От: CString  
Дата: 26.01.07 09:24
Оценка:
Здравствуйте, ElcnU, Вы писали:

B>>8)Теперь смотрим в диспетчер задач. Память выдялемая под наш процесс постоянно УВЕЛИЧИВАЕТСЯ!


Хех, и точно...

EU>попробуй сделать так

EU>
CDialog* dlg=new CDialog(IDD_DLG2);
dlg->>DoModal();
EU>delete dlg;

не, это не помогает, тоже такая идея возникла
Re: Баг CDialog + сраный MFC = утечки
От: algol Россия about:blank
Дата: 26.01.07 10:21
Оценка: 2 (1)
Здравствуйте, Blabla, Вы писали:

B>1)С помощью мастера создаем проект-диалог

B>2)Создаем в ресурсах еще один диалог с ID=IDD_DLG2
B>3)На сгенерированном мастером диалоге (при создании проекта) кидаем кнопку и создаем обработчик нажатия этой кнопки
B>4)В обработчике этой кнопки пишем следующий код:

B>CDialog dlg(IDD_DLG2);

B>dlg.DoModal();

B>Кто нибудь может это объяснить?

B>И можно от этого как-нибудь избавиться?

В MSDN подобная проблема упоминается в KB309121 "BUG: Nested Dialog Boxes Leak Memory" и KB839859 "Temporary MFC objects may not be deleted in Windows CE Platform Builder". Там читаем, что "Desktop Windows MFC uses idle processing time to clean up the memory that is used by these temporary objects."
Поскольку вы все время жмете Enter, то OnIdle не вызывается и MFC не получает возможности очистить память. Отпустите кнопку, и все будет хорошо.
Re: Баг CDialog + сраный MFC = утечки
От: orefkov  
Дата: 27.01.07 07:12
Оценка: 2 (1)
Здравствуйте, Blabla, Вы писали:

B>Что за хрень?

B>Кто нибудь может это объяснить?
B>И можно от этого как-нибудь избавиться?

Попробуй переписать InitInstance() вот так:

BOOL CMainApp::InitInstance()
{
    pDlg = new CMyDlg(); // Класс диалога, созданного мастером
    m_pMainWnd = pDlg;
    pDlg->Create(CMyDlg::IDD);
    return TRUE;
}

// И еще в основном диалоге
void CMyDlg::PostNcDestroy()
{
    AfxGetApp()->m_pMainWnd = NULL;
    AfxGetApp()->PostThreadMessage(WM_QUIT, 0, 0);
    delete this;
}


Просто когда основной диалог открывается модально (как по умолчанию делает мастер), не работает CWinApp::OnIdle.
Re: Баг CDialog + сраный MFC = утечки
От: Albatross  
Дата: 27.01.07 20:00
Оценка:

CDialog dlg(IDD_DLG2);
dlg.DoModal();
AfxGetApp()->OnIdle(1);


Должно работать
Re[2]: Баг CDialog + сраный MFC = утечки
От: Аноним  
Дата: 30.01.07 07:50
Оценка:
Здравствуйте, Albatross, Вы писали:

A>

A>CDialog dlg(IDD_DLG2);
A>dlg.DoModal();
A>AfxGetApp()->OnIdle(1);

A>


A>Должно работать



Это действительно улучшило ситуацию, намного улучшило, но течка памяти все равно происходит, только реже
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.