尝试在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
,它就完美无缺。
答案 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)