Ошибка при выполнении приложений на QT

Автор: olkv Дата: 08.08.2003 14:34 ASP Linux 9, QT 3.1

При компиляции система не выдает никаких ошибок, а
при выполнении переодически вывыливается и выдает ошибку
Segmentation fault.
Заметил, что данная ошибко в основном появляется при добавлении
новых объектов в формы.
Может кто нибудь знаект как сней бороться ?
Заранее балагодарен.
Re: Ошибка при выполнении приложений на QT 09.08.2003 21:37XMan Я знаю - 99% вероятность, что ошибка в твоем коде. Например, в слоте, который выполняется при добавлении нового объекта.
Проверь всё внимательно. Можно даже в gdb (kdbg).
Re: Ошибка при выполнении приложений на QT 11.08.2003 05:44olkv Если данныя ошибка из-за кода, тогда как объяснить такую ситуацию :

После компиляции и выполнения выскакивает ошибка Segmentation fault,
далее заходим в main.cpp всавляем пробел, убираем пробел (имитриуем изменения в гол.модуле), после этого снова компилируем (замечу, что болше ничего неменяется) и все работает нормально.

Может быть это ощибка связано с компилятором ?
Re: Ошибка при выполнении приложений на QT 11.08.2003 06:24wizard580 Именно такого у меня не встречалось, но все равно и я думаю, что ошибка где-то в коде.

Если можешь/хочешь, то покажи прогу. Если небольшая, может поможем...
Re: Ошибка при выполнении приложений на QT 11.08.2003 09:23olkv Попытаюсь описать все действия по шагам :

1. создаю проект main.pro
2. Создаю новый объект "Окно" Widget (name=FMain)
3. создаю main.cpp =

#include <qapplication.h>
#include "fmain.h"
int main( int argc, char ** argv )
{
QApplication a( argc, argv );
FMain w;
w.show();
a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( quit() ) );
return a.exec();
}


4. Создаем новый объект "Окно" Dialog (name=Form2)
5. В окне FMain добавляем кнопку, которая вызывает окно Form2 =

#include "form2.h"

void FMain::pushButton1_clicked()
{
Form2 *dlg = new Form2(this,"dialog",TRUE);
if(dlg->exec()) {
}

delete dlg;
}

6. Запускаю qmake
7. Запускаю make =
g++ -c -pipe -Wall -W -O2 -g -pipe -march=i386 -mcpu=i686 -DGLX_GLXEXT_LEGACY -fno-use-cxa-atexit -fno-exceptions -DQT_NO_DEBUG -I/usr/lib/qt-3.1/mkspecs/default -I. -I/usr/lib/qt-3.1/include -I.ui/ -I.moc/ -o .obj/fmain.o .ui/fmain.cpp
/usr/lib/qt-3.1/bin/uic form2.ui -i form2.h -o .ui/form2.cpp
g++ -c -pipe -Wall -W -O2 -g -pipe -march=i386 -mcpu=i686 -DGLX_GLXEXT_LEGACY -fno-use-cxa-atexit -fno-exceptions -DQT_NO_DEBUG -I/usr/lib/qt-3.1/mkspecs/default -I. -I/usr/lib/qt-3.1/include -I.ui/ -I.moc/ -o .obj/form2.o .ui/form2.cpp
/usr/lib/qt-3.1/bin/moc .ui/fmain.h -o .moc/moc_fmain.cpp
g++ -c -pipe -Wall -W -O2 -g -pipe -march=i386 -mcpu=i686 -DGLX_GLXEXT_LEGACY -fno-use-cxa-atexit -fno-exceptions -DQT_NO_DEBUG -I/usr/lib/qt-3.1/mkspecs/default -I. -I/usr/lib/qt-3.1/include -I.ui/ -I.moc/ -o .obj/moc_fmain.o .moc/moc_fmain.cpp
/usr/lib/qt-3.1/bin/moc .ui/form2.h -o .moc/moc_form2.cpp
g++ -c -pipe -Wall -W -O2 -g -pipe -march=i386 -mcpu=i686 -DGLX_GLXEXT_LEGACY -fno-use-cxa-atexit -fno-exceptions -DQT_NO_DEBUG -I/usr/lib/qt-3.1/mkspecs/default -I. -I/usr/lib/qt-3.1/include -I.ui/ -I.moc/ -o .obj/moc_form2.o .moc/moc_form2.cpp
g++ -o main .obj/main.o .obj/fmain.o .obj/form2.o .obj/moc_fmain.o .obj/moc_form2.o -L/usr/lib/qt-3.1/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm

Создается *main
Запускаю, вызываю окно Form2. Все нормально работает.

8. В форму Form2 добавляю 2 объект LineEdit и кнопку pushButton
При этом никаких обработок в Form2 нет (потом добавил пустую процедуру, все равно ошибка осталась) =

void Form2::pushButton4_clicked()
{

}

9. Компилируем make =
/usr/lib/qt-3.1/bin/uic form2.ui -o .ui/form2.h
/usr/lib/qt-3.1/bin/uic form2.ui -i form2.h -o .ui/form2.cpp
g++ -c -pipe -Wall -W -O2 -g -pipe -march=i386 -mcpu=i686 -DGLX_GLXEXT_LEGACY -fno-use-cxa-atexit -fno-exceptions -DQT_NO_DEBUG -I/usr/lib/qt-3.1/mkspecs/default -I. -I/usr/lib/qt-3.1/include -I.ui/ -I.moc/ -o .obj/form2.o .ui/form2.cpp
/usr/lib/qt-3.1/bin/moc .ui/form2.h -o .moc/moc_form2.cpp
g++ -c -pipe -Wall -W -O2 -g -pipe -march=i386 -mcpu=i686 -DGLX_GLXEXT_LEGACY -fno-use-cxa-atexit -fno-exceptions -DQT_NO_DEBUG -I/usr/lib/qt-3.1/mkspecs/default -I. -I/usr/lib/qt-3.1/include -I.ui/ -I.moc/ -o .obj/moc_form2.o .moc/moc_form2.cpp
g++ -o main .obj/main.o .obj/fmain.o .obj/form2.o .obj/moc_fmain.o .obj/moc_form2.o -L/usr/lib/qt-3.1/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm


Ошибок не выдает.

10. Запускаем *main

11. Нажимаем на кнопку вызова диалога Form2

12. Прогрмма вылетает в терминале появляется ошибка
Segmentation fault

13. Далее если в main.cpp и fmain.ui.h добавить и убрать пробелы, т.е. с
имитировать их изменения и откомпелировать приложение занова, то
программа работает без всяких ошибок.
Re: Ошибка при выполнении приложений на QT 11.08.2003 10:48Vladimir Dyakov olkv, конкретно в программировании в qt не очень понимаю, но все симптомы очень похожи на то, что вы либо пишите в недоступную вам память, либо пытаетесь освободить что-то не ваше. Это может быть из-за лишнего освобождения памяти (delete, free). Segmentation fault - ошибка сегментации, обращение к недоступной памяти.
Re: Ошибка при выполнении приложений на QT 11.08.2003 16:52ip82 А если убрать строчку delete dlg;
Может поможет
Re: Ошибка при выполнении приложений на QT 11.08.2003 21:26XMan to olkv:

Зашли мне сие чудо на в архиве.
А то ни fmain, ни form2 полностью не видать Улыбка
Re: Ошибка при выполнении приложений на QT 12.08.2003 07:59Vladimir Dyakov >Сомневаюсь, что ошибка вызвана добавлением кода
>
>Object A = new Object(...);
>A.exec();
>delete A;
>
>Может быть все таки проблемма с компиляцией и сборкой.
>Попробую манипулировать опциями компилятора.
>
Быть может, компилятор сам освобождает ресурсы, которые вы выделяете стандартными методами. Вообще, программирование в IDE всегда славилось такими фокусами ;-) У меня были подобные проблемы при работе в Delphi. Кстати, быть может, ваш объект является составным более сложного объекта, который удаляется до освобождения целевого объекта, а в его деструкторе прописано уничтожение входящих в него членов.

Если не трудно, пишите в форум Улыбка Пусть сохранится для будущих поколений.
Re: Ошибка при выполнении приложений на QT 12.08.2003 09:49olkv Убрал

delete dlg;

вроде заработало. Наверное действительно деструктор убирает за
собой мусор.

Есть еще вопрос по QT, но для этого открываю новую тему.
Re: Ошибка при выполнении приложений на QT 12.08.2003 22:29XMan Вообще-то не должно оно было так делать - ты должен иметь возможность получить разные данные от диалога кроме ответа Да/Нет Улыбка
RSS-материал