[英]Qt Segmentation fault at exec()
嘗試在派生自QApplication
的類HmiApplication
運行QProcess
時遇到一個非常奇怪的問題。
該應用程序在main.cpp
第6行中引發SIGSEGV 。 僅當hmiapplication.cpp
第11 hmiapplication.cpp
被注釋掉(如果我不qDebug()
QProcess的標准輸出qDebug()
時,才會發生這種情況。
為了簡單明了起見,我在創建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()
{
}
編輯:如果我添加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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.