2010-04-26 71 views
2

我有一個類看起來像這樣:如何正確刪除QProcess實例?

class FakeRunner : public QObject 
{ 
    Q_OBJECT 
private: 
    QProcess* proc; 
public: 
    FakeRunner(); 
    int run() 
    { 
     if (proc) 
      return -1; 
     proc = new QProcess(); 
     QStringList args; 
     QString programName = "fake.exe"; 

     connect(comp, SIGNAL(started()), this, SLOT(procStarted())); 
     connect(comp, SIGNAL(error(QProcess::ProcessError)), this, 
       SLOT(procError(QProcess::ProcessError))); 
     connect(comp, SIGNAL(finished(int, QProcess::ExitStatus)), this, 
       SLOT(procFinished(int, QProcess::ExitStatus))); 

     proc->start(programName, args); 

     return 0; 
    }; 

private slots: 
    void procStarted() {}; 
    void procFinished(int, QProcess::ExitStatus) {}; 
    void procError(QProcess::ProcessError); 
} 

由於「fake.exe」並不在我的系統存在,PROC發出錯誤()信號。如果我像下面那樣處理它,我的程序崩潰了:

void FakeRunner::procError(QProcess::ProcessError rc) 
{ 
    delete proc; 
    proc = 0; 
} 

但是,如果我不刪除指針,它工作得很好。所以,問題是應該如何(以及何時)刪除指向QProcess的指針?我相信我必須刪除它以避免內存泄漏。 FakeRunner :: run()可以被調用多次,所以泄漏(如果有的話)會增長。

謝謝!

回答

8

您不能刪除QObject插槽內的實例,該實例使用普通刪除操作符連接到此實例中的信號。這是因爲如果使用直接連接的信號和時隙連接,那麼實際上由moc的信號實現調用的時隙。這就像是從班級成員裏面嘗試delete this;。有一個解決方案QObject::deleteLater()。對象將被事件處理函數中的Qt事件循環刪除。所以你需要撥打proc->deleteLater()

而且您不需要從插槽中斷開信號,因爲Qt會在QObject被刪除時自動執行。

+0

我明白了。在我調用proc-> deleteLater()之後它是否安全無效,或者我應該使用不同的方法來查找進程是否存在(我在run()函數的開頭檢查這個以避免重複的進程)? – Kopfschmerzen 2010-04-27 07:22:50

+0

您可以安全地取消deleteLater()後的指針。 – VestniK 2010-04-27 08:19:10