如何正确删除QProcess实例?

4

我有一个长这样的类:

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个回答

8
在一个已连接到该实例内信号的槽函数中,您无法使用正常的删除操作符删除 QObject 实例。这是因为如果使用直接连接连接信号和槽,则槽实际上是由 moc 创建的信号实现调用的。这就像在类成员内部尝试执行 delete this; 一样。有一种解决方案是使用 QObject::deleteLater()。对象将在 Qt 事件循环中的事件处理函数中被删除。所以在您的情况下需要调用 proc->deleteLater()
另外,当删除 QObject 时,您不需要断开信号与槽的连接,因为 Qt 会自动执行此操作。

我明白了。在调用proc->deleteLater()之后,将指针置空是否安全?或者我应该使用其他方法来判断进程是否存在(我在run()函数的开头检查这一点,以避免重复进程)? - Kopfschmerzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接