Russian Qt Forum
Ноябрь 26, 2024, 07:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Падают QDialog(this) - Qt 3.3.3, MultiThread DLL, Win32  (Прочитано 7295 раз)
Anonymous
Гость
« : Февраль 02, 2005, 13:21 »

Вот проблема:
Большое, сложное приложение, в основе лежит QMainWindow.
Под линуксом всё пашет уже давно. Перевёл под win32 - начались траблы.

Делаем ПРОСТЕЙШИЙ вызов своего AboutDialog.

Код:
void myServerWindow::helpAbout()
{
    AboutDialog dlg(this);
    dlg.exec();
//для отслеживания ошибки
QMessageBox::warning(this, "Step", "debug", QMessageBox::Ok, 0, 0);
    return;
}


Что получается: сразу после вывода эбаута жмём ОК, потом показывается "debug", а потом приложение падает. Стек показывает чёрти куда.

->00966239()
dddddddd()

Судя по всем признакам, как-то не корректно срабатывает то ли деструктор, то ли очистка мусора. Поскольку диалог имеет родителя (parent который this, т.е. основное окно, либо, если NULL, то это qApp), то значит, что-то там не так работает - похоже, parent делает delete уже несуществующему объекту. Но все примеры от самих Qt работают нормально, только у меня хрень какая-то.

Из той же оперы: проверялись вызовы QFileDialog(0,0, this). Как только закрываешь приложение, идёт крах. Если QFileDialog не вызывать - всё нормально.

Компиляция: debug multithread dll, win32, 3.3.3 коммерческий.

Я уже в трансе, тихонько стучусь головой об стол. Помогите, пожалуйста.[/code]
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Февраль 02, 2005, 14:35 »

давай по шагам

берешь под Линуксом valgrind

натравливаешь на свое приложение и смотришь нет ли багов!!
Записан
dynam
Гость
« Ответ #2 : Февраль 03, 2005, 15:17 »

a tak tozhe padaet?

AboutDlg dlg; // bez this
dlg.exec();
Записан
Zigmar
Гость
« Ответ #3 : Февраль 03, 2005, 23:48 »

Я думаю dynam прав. Если ты создаешь виджет на стеке, то не надо ему давать папу. А то, похоже, папа пытается его удалить, и, естественно, валится.
Записан
Sergeich
Гость
« Ответ #4 : Февраль 04, 2005, 07:42 »

ИХМО вся фишка в том что объект создается в стеке. К стековым объектам нельзя применять delete( при захвате памяти в куче обычно перед выделяемым блоком памяти записывается его размер, по которому delete определяет сколько байт ему нужно освободить, а при захвате в стеке ничего подобного не происходит, в итоге результаты применения delete к стековому объекту непредсказуемы  ). Похоже Qt пытается удалить объект в стеке, в данном случае твой диалог. Вообще писать что-то типа QObject obj( par ) оченно нехорошо, так как ты неявно передаешь указатель на стековый объект obj его родителю par, и хрен его знает когда он (par) захочет к нему обратиться, весьма вероятно что после его удаления. Никогда не передавай указатель на стековый объект во внешнии функции, если абсолютно не уверен что они его где-нить не сохранят после завершения
Записан
RamsesIII
Гость
« Ответ #5 : Февраль 04, 2005, 13:25 »

Wse windgeti imeeuschie parent, dolschni sozdawatsja dinamitscheski (pri pomoschi operatora new)!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.