簡體   English   中英

exec()的Qt分段錯誤

[英]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()行都沒有關系,在兩種情況下都會引發分段錯誤。

CameraQLabel的派生類,並且在沒有上述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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM