在exec()的Qt分段错误

时间:2017-11-16 13:05:51

标签: c++ qt memory-leaks sigsegv qapplication

尝试在QProcess的{​​{1}}课程中运行HmiApplication时,我遇到了一个非常奇怪的问题。

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

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

的main.cpp

qDebug()

hmiapplication.h

#include "hmiapplication.h"

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

hmiapplication.cpp

#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

修改 如果我将#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,它就完美无缺。

1 个答案:

答案 0 :(得分:2)

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

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

文档也警告......

  

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

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

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

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