Qt 4 - Проблемы с QProcess

Я пытаюсь скомпилировать приложение Qt 4, содержащее вызов QProcess.

Это не проблема скомпилировать его как Release-Version, но я всегда получаю SegmentionFault-Error, когда запускаю Debug-Version.

Моя версия Qt — 4.8.2, и я пробовал ее на ОС Fedora и Debian.

Были ли у кого-нибудь из вас подобные проблемы? Я не могу понять это!

#include <QApplication>
#include "mainwindow.h"
#include <QProcess>

class MyApplication : public QApplication{
public:
    QProcess * proc;
    MyApplication(int argc, char** argv) : QApplication(argc, argv){
        proc = new QProcess();
    }
};

int main(int argc, char *argv[])
{
    MyApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

Хорошего дня, Маркус.


person m.schmidinger    schedule 13.04.2014    source источник
comment
спасибо за ответ, вот что показывает мне gdb: pastebin.com/A0pREW1S   -  person m.schmidinger    schedule 13.04.2014
comment
хммм, когда я комментирую qprocess-материал, это не проблема. главное окно довольно пустое, только что сделал новое простое приложение qt-gui-application pastebin.com/dm5NwniH   -  person m.schmidinger    schedule 13.04.2014
comment
pastebin.com/yABLvmaQ — это заголовок.   -  person m.schmidinger    schedule 13.04.2014
comment
QMainWindow тоже не работает:/   -  person m.schmidinger    schedule 13.04.2014
comment
ваш фрагмент также работает только в версии Release.   -  person m.schmidinger    schedule 13.04.2014


Ответы (1)


Сбой вызван этой строкой:

MyApplication(int argc, char **argv);

Вы должны изменить его на:

MyApplication(int &argc, char **argv);

Причина в том, что без ссылки включена временная копия, которая в основном уничтожается, в то время как ее адрес все еще сохраняется. После этого происходит сбой при доступе.

См. предупреждение в документации конструктора QApplication:

Предупреждение: данные, на которые ссылаются argc и argv, должны оставаться действительными в течение всего времени существования объекта QCoreApplication. Кроме того, argc должен быть больше нуля, а argv должен содержать хотя бы одну допустимую строку символов.

При этом, вероятно, не стоит создавать подклассы QApplication в вашем случае. Даже если вы это сделаете, убедитесь, что у вас нет утечки памяти, не удаляя объект кучи, созданный для обработки фонового процесса с помощью QProcess.

person lpapp    schedule 13.04.2014
comment
большое спасибо за помощь! есть идеи, почему он просто ломается в режиме отладки? - person m.schmidinger; 13.04.2014
comment
@ m.schmidinger Это называется неопределенным поведением. Скажи спасибо, что не нанес ядерный удар :) - person Kuba hasn't forgotten Monica; 14.04.2014