1

尝试QProcessHmiApplication派生自QApplication.

应用程序在第 6 行抛出一个SIGSEGVmain.cpp。仅当hmiapplication.cpp注释掉第 11 行时才会发生这种情况(如果我没有qDebug()QProcess 的标准输出)。

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

主文件

#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

hmiapplication.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

4

1 回答 1

4

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

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

随着文档还警告说......

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

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

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

HmiApplication::HmiApplication(int &argc, char **argv)
于 2017-11-16T13:30:38.877 回答