【问题标题】:Qt 4 - QProcess problemsQt 4 - QProcess 问题
【发布时间】:2014-04-13 16:52:24
【问题描述】:

我正在尝试编译一个包含 QProcess 调用的 Qt 4 应用程序。

编译为Release-Version没有问题,但是当我执行Debug-Version时总是得到SegmentionFault-Error。

我的 Qt 版本是 4.8.2,我在 Fedora 和 Debian OS 上试用过。

你们中有人遇到过类似的问题吗? 我想不通!

#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();
}

祝你有美好的一天, 马库斯

【问题讨论】:

  • 感谢您的回复,这是 gdb 向我展示的内容:pastebin.com/A0pREW1S
  • 嗯,当我注释掉 qprocess-stuff 时,它没有问题。主窗口很空,只是做了一个简单的新 qt-gui-application pastebin.com/dm5NwniH
  • pastebin.com/yABLvmaQ 这是标题。
  • QMainWindow 也不起作用:/
  • 您的 sn-p 也仅适用于发布版本。

标签: c++ qt qt4 qtgui qapplication


【解决方案1】:

崩溃是由这一行引起的:

MyApplication(int argc, char **argv);

您应该将其修改为:

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

原因是,在没有引用的情况下,包含了一个临时副本,它基本上被破坏了,而它的地址仍然被存储。崩溃发生在之后的访问。

查看QApplication构造函数的警告in the documentation

警告:argc 和 argv 引用的数据必须在 QCoreApplication 对象的整个生命周期内保持有效。此外,argc 必须大于零,并且 argv 必须至少包含一个有效字符串。

话虽如此,在您的情况下,可能不值得将QApplication 子类化。即使你这样做了,请确保你不会通过不删除为处理QProcess 的后台进程而创建的堆对象来泄漏内存。

【讨论】:

  • 非常感谢您的帮助!知道为什么它会在调试模式下中断吗?
  • @m.schmidinger 这称为未定义行为。感谢它没有发动核打击:)
猜你喜欢
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
相关资源
最近更新 更多