我在尝试在类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)