Как правильно удалить экземпляр QProcess? - PullRequest
2 голосов
/ 26 апреля 2010

У меня есть класс, похожий на этот:

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 голосов
/ 26 апреля 2010

Вы не можете удалить экземпляр QObject внутри слота, который в этом случае подключен к сигналу с помощью обычного оператора удаления. Это связано с тем, что если сигнал и слот подключены с использованием прямого соединения, то слот фактически вызывается из реализации сигнала, сделанной moc. Это похоже на попытку delete this; изнутри члена класса. Есть решение QObject::deleteLater(). Объект будет удален циклом событий Qt внутри функции обработки событий. Так что вам нужно позвонить proc->deleteLater() в вашем случае.

И вам не нужно отключать сигнал от слота, поскольку Qt делает это автоматически, когда QObject удаляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...