Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не модальный диалог, Утечка памяти 
:(
    Опции темы
Nastya
Дата 11.8.2003, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Такая проблема. Хочу (по ряду причин) в качестве главного окна программы сделать диалог, только не модальный.
Что творю:
1. Создаю свой класс от CDialog, и в конструкторе вызываю Create(ресурс).
2. В этом же классе по нажатию одной из кнопок делаю DistroyWindow()
3. В классе приложения в InitInstance пишу:
m_pMainWnd=new CMyDlg; (*)
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
4. В ExitInstance делаю delete m_pMainWnd.

Все работает. Но дает утечку памяти в строке (*).
В чем проблема, ума не приложу. может кто подскажет?



--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
RAN
Дата 11.8.2003, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Вот за это я не люблю кошек tounge.gif (читай, MFC, VCL и т.п.) Никогда не знаешь точно, как выполняется твоя команда.
Короче такая фигня, вот этого делать нельзя:
Цитата

ExitInstance делаю delete m_pMainWnd

Удалять объект надо в методе PostNcDestroy.
Код

void CMyDlg::PostNcDestroy()
{
   CDialog :: PostNcDestroy (); //Эта строка не обязательна, поскольку в VC6 в CDialog метод PostNcDestroy пуст ( {} )
   /* тут должны быть ВСЕ delete динам. объектов в диалоге */
   delete this;
}


Теперь, чтоб очистить память и удалить диалог надо вызвать его метод CMyDlg::DestoyWindow(). Что у тебя уже сделано:
Цитата

В этом же классе по нажатию одной из кнопок делаю DistroyWindow()


И ещё. Не знаю известно ли тебе, но CDialog::EndDialog() не удаляет немодальный диалог, он его только скрывает. Поэтому надо переписать обработчики OnOK и OnCancel.
Код

void CMyDialog::OnOK()
{
   CDialog ::OnOK();
   DestroyWindow(); //теперь память будет освобождаться
}

void CMyDialog::OnCancel()
{
   CDialog::OnCancel();
   DestroyWindow(); // тоже самое
}


Удачи.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0407 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.