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