Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Anonymous от Февраль 02, 2005, 13:21



Название: Падают QDialog(this) - Qt 3.3.3, MultiThread DLL, Win32
Отправлено: 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]


Название: Падают 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)!!!