我有一个看起来像这样的类:
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(),因此泄漏将会增加。
谢谢!
发布于 2010-04-26 17:46:23
您不能删除插槽内的QObject实例,该实例使用普通删除操作符连接到此实例中的信号。这是因为,如果信号和插槽使用直接连接,那么插槽实际上是从moc的信号实现中调用的。这就像尝试从类的成员内部执行delete this;一样。有一个解决方案QObject::deleteLater()。对象将被事件处理函数内部的Qt事件循环删除。因此,在您的情况下需要调用proc->deleteLater()。
而且你不需要从插槽断开信号,因为Qt会在QObject被删除时自动断开。
https://stackoverflow.com/questions/2712183
复制相似问题