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

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

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

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


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()
{
}


编辑:
如果我在标题中添加qDebug()

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


到源文件,是否删除QVector<Camera*> cameras;行都没有关系,在两种情况下都会引发分段错误。

qDebug()Camera的派生类,在没有上述QLabel的情况下可以完美地工作。

最佳答案

QApplication constructor通过引用接受其第一个参数...

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


随着文档也警告...


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


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

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

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

10-08 16:19