exec() 处的 Qt 分段错误



我在尝试在类HmiApplication中运行QProcess时遇到了一个非常奇怪的问题,该类是从QApplication派生的。

应用程序在第 6 行中抛出一个 SIGSEGV main.cpp 。仅当hmiapplication.cpp的第 11 行被注释掉时,才会发生这种情况(如果我不qDebug() QProcess 的 stdout(。

为了简单明了起见,我在创建 QProcess 时没有处理任何返回值。

主.cpp

#include "hmiapplication.h"
int main(int argc, char **argv)
{
    HmiApplication hmi(argc, argv);
    return hmi.exec(); // LINE 6 - SIGSEGV
}

hmiapplication.h

#ifndef HMIAPPLICATION_H
#define HMIAPPLICATION_H
#include <QApplication>
#include <QProcess>
class HmiApplication : public QApplication
{
    Q_OBJECT
public:
    HmiApplication(int argc, char **argv);
    virtual ~HmiApplication();
private:
    QProcess *macFinder = nullptr;
};
#endif // HMIAPPLICATION_H

HMI应用.cpp

#include "hmiapplication.h"
HmiApplication::HmiApplication(int argc, char **argv) : QApplication(argc, argv)
{
    macFinder = new QProcess(this);
    macFinder->start("arping", QStringList() << "-c 2" << "192.168.1.1");
    macFinder->waitForReadyRead();
    QString ret(macFinder->readAllStandardOutput());
    ret = ret.mid(ret.indexOf('[') + 1, 17);
    qDebug() << ret; // LINE 11
}
HmiApplication::~HmiApplication()
{
}

编辑:如果我在标题中添加QVector<Camera*> cameras;并且

for(quint8 i = 0; i < 10; i++) {
    Camera *cam = new Camera(i);
    cameras.append(cam);
}

到源文件,我是否删除qDebug()行并不重要,并且在这两种情况下都会抛出分段错误。

Camera 是派生的QLabel类,无需上面提到的QProcess即可完美运行。

QApplication构造函数通过引用接受其第一个参数...

QApplication::QApplication(int &argc, char **argv)

文档还警告...

argc和argv引用的数据必须在整个过程中保持有效 QApplication 对象的生存期。此外,argc必须更大 小于零和 argv 必须至少包含一个有效字符串。

但是,您将argc传递给HmiApplication。 因此,QApplication构造函数会收到对本地副本的非常量引用,该引用将在HmiApplication ctor结束时超出范围,导致以后未定义的行为。

将构造函数的签名更改为...

HmiApplication::HmiApplication(int &argc, char **argv)

相关内容

  • 没有找到相关文章

最新更新