我有一个类看起来像这样:
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);
}
Run Code Online (Sandbox Code Playgroud)
由于我的系统上不存在"fake.exe",proc会发出error()信号.如果我像下面这样处理它,我的程序崩溃:
void FakeRunner::procError(QProcess::ProcessError rc)
{
delete proc;
proc = 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我不删除指针,它运行良好.那么,问题是我应该如何(以及何时)删除指向QProcess的指针?我相信我必须删除它以避免内存泄漏.FakeRunner :: run()可以多次调用,因此泄漏(如果有的话)会增长.
谢谢!
您无法QObject使用普通删除操作符删除在此实例中连接到信号的插槽内的实例.这是因为如果信号和插槽使用直接连接连接,那么插槽实际上是从moc所做的信号实现中调用的.这就像delete this;从类成员内部尝试一样.有一个解决方案QObject::deleteLater().对象将被事件处理函数内的Qt事件循环删除.所以你需要打电话给proc->deleteLater()你的情况.
并且您不需要断开信号与插槽的连接,因为Qt在QObject删除时会自动执行.