exec() 中的 Qt 分段错误
Qt Segmentation fault at exec()
我在尝试 运行 派生自 QApplication
的 class HmiApplication
中的 QProcess
时遇到了一个非常奇怪的问题。
应用程序在 main.cpp
的第 6 行抛出 SIGSEGV。仅当 hmiapplication.cpp
的第 11 行被注释掉时才会发生这种情况(如果我不 qDebug()
QProcess 的标准输出)。
为了简单明了,我在创建 QProcess 时没有处理任何 return 值。
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()
{
}
编辑:
如果我将 QVector<Camera*> cameras;
添加到 header 和
for(quint8 i = 0; i < 10; i++) {
Camera *cam = new Camera(i);
cameras.append(cam);
}
到源文件,我是否删除 qDebug()
行并不重要,在这两种情况下都会抛出分段错误。
Camera
是 QLabel
的派生 class,并且在没有上面提到的 QProcess
的情况下也能完美地工作。
QApplication
constructor 通过引用接受它的第一个参数...
QApplication::QApplication(int &argc, char **argv)
文档还警告说...
The data referred to by argc and argv must stay valid for the entire
lifetime of the QApplication object. In addition, argc must be greater
than zero and argv must contain at least one valid character string.
但是,您通过 值 将 argc
传递给了 HmiApplication
。因此,QApplication
构造函数接收到对本地副本的非 const 引用,该副本将在 HmiApplication
构造函数的末尾超出范围,导致稍后出现未定义的行为。
将构造函数的签名更改为...
HmiApplication::HmiApplication(int &argc, char **argv)
我在尝试 运行 派生自 QApplication
的 class HmiApplication
中的 QProcess
时遇到了一个非常奇怪的问题。
应用程序在 main.cpp
的第 6 行抛出 SIGSEGV。仅当 hmiapplication.cpp
的第 11 行被注释掉时才会发生这种情况(如果我不 qDebug()
QProcess 的标准输出)。
为了简单明了,我在创建 QProcess 时没有处理任何 return 值。
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()
{
}
编辑:
如果我将 QVector<Camera*> cameras;
添加到 header 和
for(quint8 i = 0; i < 10; i++) {
Camera *cam = new Camera(i);
cameras.append(cam);
}
到源文件,我是否删除 qDebug()
行并不重要,在这两种情况下都会抛出分段错误。
Camera
是 QLabel
的派生 class,并且在没有上面提到的 QProcess
的情况下也能完美地工作。
QApplication
constructor 通过引用接受它的第一个参数...
QApplication::QApplication(int &argc, char **argv)
文档还警告说...
The data referred to by argc and argv must stay valid for the entire lifetime of the QApplication object. In addition, argc must be greater than zero and argv must contain at least one valid character string.
但是,您通过 值 将 argc
传递给了 HmiApplication
。因此,QApplication
构造函数接收到对本地副本的非 const 引用,该副本将在 HmiApplication
构造函数的末尾超出范围,导致稍后出现未定义的行为。
将构造函数的签名更改为...
HmiApplication::HmiApplication(int &argc, char **argv)