如何正确删除QProcess实例?

Kop*_*zen 3 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);
}
Run Code Online (Sandbox Code Playgroud)

由于我的系统上不存在"fake.exe",proc会发出error()信号.如果我像下面这样处理它,我的程序崩溃:

void FakeRunner::procError(QProcess::ProcessError rc)
{
    delete proc;
    proc = 0;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Ves*_*niK 8

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

并且您不需要断开信号与插槽的连接,因为Qt在QObject删除时会自动执行.