Название: Падают QDialog(this) - Qt 3.3.3, MultiThread DLL, Win32 Отправлено: Anonymous от Февраль 02, 2005, 13:21 Вот проблема:
Большое, сложное приложение, в основе лежит QMainWindow. Под линуксом всё пашет уже давно. Перевёл под win32 - начались траблы. Делаем ПРОСТЕЙШИЙ вызов своего AboutDialog. Код: void myServerWindow::helpAbout() Что получается: сразу после вывода эбаута жмём ОК, потом показывается "debug", а потом приложение падает. Стек показывает чёрти куда. ->00966239() dddddddd() Судя по всем признакам, как-то не корректно срабатывает то ли деструктор, то ли очистка мусора. Поскольку диалог имеет родителя (parent который this, т.е. основное окно, либо, если NULL, то это qApp), то значит, что-то там не так работает - похоже, parent делает delete уже несуществующему объекту. Но все примеры от самих Qt работают нормально, только у меня хрень какая-то. Из той же оперы: проверялись вызовы QFileDialog(0,0, this). Как только закрываешь приложение, идёт крах. Если QFileDialog не вызывать - всё нормально. Компиляция: debug multithread dll, win32, 3.3.3 коммерческий. Я уже в трансе, тихонько стучусь головой об стол. Помогите, пожалуйста.[/code] Название: Падают QDialog(this) - Qt 3.3.3, MultiThread DLL, Win32 Отправлено: Admin от Февраль 02, 2005, 14:35 давай по шагам
берешь под Линуксом valgrind натравливаешь на свое приложение и смотришь нет ли багов!! Название: Падают QDialog(this) - Qt 3.3.3, MultiThread DLL, Win32 Отправлено: dynam от Февраль 03, 2005, 15:17 a tak tozhe padaet?
AboutDlg dlg; // bez this dlg.exec(); Название: Падают QDialog(this) - Qt 3.3.3, MultiThread DLL, Win32 Отправлено: Zigmar от Февраль 03, 2005, 23:48 Я думаю dynam прав. Если ты создаешь виджет на стеке, то не надо ему давать папу. А то, похоже, папа пытается его удалить, и, естественно, валится.
Название: Падают QDialog(this) - Qt 3.3.3, MultiThread DLL, Win32 Отправлено: Sergeich от Февраль 04, 2005, 07:42 ИХМО вся фишка в том что объект создается в стеке. К стековым объектам нельзя применять delete( при захвате памяти в куче обычно перед выделяемым блоком памяти записывается его размер, по которому delete определяет сколько байт ему нужно освободить, а при захвате в стеке ничего подобного не происходит, в итоге результаты применения delete к стековому объекту непредсказуемы ). Похоже Qt пытается удалить объект в стеке, в данном случае твой диалог. Вообще писать что-то типа QObject obj( par ) оченно нехорошо, так как ты неявно передаешь указатель на стековый объект obj его родителю par, и хрен его знает когда он (par) захочет к нему обратиться, весьма вероятно что после его удаления. Никогда не передавай указатель на стековый объект во внешнии функции, если абсолютно не уверен что они его где-нить не сохранят после завершения
Название: Падают QDialog(this) - Qt 3.3.3, MultiThread DLL, Win32 Отправлено: RamsesIII от Февраль 04, 2005, 13:25 Wse windgeti imeeuschie parent, dolschni sozdawatsja dinamitscheski (pri pomoschi operatora new)!!!
|