【发布时间】:2018-10-14 19:18:34
【问题描述】:
试图阻止我的 QProcess 在它的父析构函数中时遇到问题。这是我的代码:
AbstractProcess::~AbstractProcess()
{
if((m_process->state() == QProcess::Running)
|| (m_process->state() == QProcess::Starting))
{
m_process->terminate();
m_process->waitForFinished();
}
}
m_process 是指向QProcess 的指针。在AbstractProcess 的构造函数中我有这个代码:
m_process = new QProcess(this);
所以,当AbstractProcess 被删除时,我得到了它的析构函数,并且在以下位置出现了分段错误:
m_process->waitForFinished();
谁能告诉我我的错误是什么?
UPD:
正如下面在 cmets 中所说,问题不在我提供的代码中。对此非常抱歉。因此,我将尝试解释问题所在。也许它会帮助某人。 AbstractProcess 正如您可能猜到的那样,它是一个抽象类。所以它有一些纯虚函数。其中有:
virtual void onProcessFinished(int exitCode, QProcess::ExitStatus
exitStatus) = 0;
我的构造函数的完整主体是:
m_process = new QProcess(this);
connect(m_process,static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished),
this, &AbstractProcess::onProcessFinished);
现在很明显,在调用waitForFinished 时,进程会发出信号finished 并调用纯虚函数。这会导致未定义的行为。为了解决这个问题,我在停止我的进程之前打电话给disconnect。析构函数现在看起来像这样:
AbstractProcess::~AbstractProcess()
{
disconnect(m_process,static_cast<void(QProcess::*)(int,QProcess::ExitStatus)>(&QProcess::finished),
this, &AbstractProcess::onProcessFinished)
if((m_process->state() == QProcess::Running)
|| (m_process->state() == QProcess::Starting))
{
m_process->terminate();
m_process->waitForFinished();
}
}
感谢大家的帮助。
【问题讨论】:
-
为什么在尝试终止该进程后需要调用
m_process->waitForFinished();?不过,这不是wait for terminated。 -
@vahancho 据我所知,在调用终止后,我必须调用 waitForFinished 以让进程完成它一直在做的所有工作。
-
@vahancho 任何程序都应该清理它启动的所有子进程,即操作系统的“等待”它。使用
waitForFinished是在 Qt 应用程序中执行此操作的一种方法(只要您在事件循环挂起直到进程退出都可以的地方或时间执行此操作)。 -
@PolinaBodnar 您应该创建一个复制问题的 MCVE。据我所知(虽然我编写了类似的代码已经有一段时间了),问题不在于您显示的代码。您可能在某处有未定义的行为...
-
我看不出所显示的代码有任何明显错误。如果可能的话,你能提供一个minimal reproducible example吗?