我的班级看起来像这样:
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()可以被多次调用,所以泄漏(如果有的话)会增长。
谢谢!
答案 0 :(得分:8)
您无法使用普通删除操作符删除此实例中连接到信号的插槽内的QObject
实例。这是因为如果信号和插槽使用直接连接连接,那么插槽实际上是从moc所做的信号实现中调用的。这就像在类成员中尝试delete this;
一样。有一个解决方案QObject::deleteLater()
。对象将被事件处理函数内的Qt事件循环删除。因此,您需要在案件中致电proc->deleteLater()
。
您不需要断开插槽中的信号,因为Qt会在删除QObject
时自动执行此操作。