如何正确删除QProcess实例?

时间:2010-04-26 09:00:20

标签: qt qt4

我的班级看起来像这样:

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会发出error()信号。如果我像下面那样处理它,我的程序崩溃了:

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

但是,如果我不删除指针,它的效果很好。那么,问题是我应该如何(以及何时)删除指向QProcess的指针?我相信我必须删除它以避免内存泄漏。 FakeRunner :: run()可以被多次调用,所以泄漏(如果有的话)会增长。

谢谢!

1 个答案:

答案 0 :(得分:8)

您无法使用普通删除操作符删除此实例中连接到信号的插槽内的QObject实例。这是因为如果信号和插槽使用直接连接连接,那么插槽实际上是从moc所做的信号实现中调用的。这就像在类成员中尝试delete this;一样。有一个解决方案QObject::deleteLater()。对象将被事件处理函数内的Qt事件循环删除。因此,您需要在案件中致电proc->deleteLater()

您不需要断开插槽中的信号,因为Qt会在删除QObject时自动执行此操作。