首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确删除QProcess实例?

如何正确删除QProcess实例?
EN

Stack Overflow用户
提问于 2010-04-26 17:00:20
回答 1查看 4.7K关注 0票数 3

我有一个看起来像这样的类:

代码语言:javascript
复制
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()信号。如果我像下面这样处理,我的程序就会崩溃:

代码语言:javascript
复制
void FakeRunner::procError(QProcess::ProcessError rc)
{
    delete proc;
    proc = 0;
}

但是,如果我不删除指针,它工作得很好。因此,问题是我应该如何(以及何时)删除指向QProcess的指针?我认为我必须删除它,以避免内存泄漏。可以多次调用FakeRunner::run(),因此泄漏将会增加。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-26 17:46:23

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

而且你不需要从插槽断开信号,因为Qt会在QObject被删除时自动断开。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2712183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档