尝试在其父级析构函数中停止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 :
正如下面评论中所述,问题不在我提供的代码中。很抱歉。所以我会尝试解释问题所在。也许它会对某人有所帮助。你可能会猜到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();
}
}
感谢大家的帮助。
答案 0 :(得分:-1)
当您首先致电m_process->terminate();
时,无法保证流程退出 ..但无法保证流程将继续存在因为在Linux上调用(WM_CLOSE
on Windows / SIGTERM
)所以在可能已经终止的进程上调用m_process->waitForFinished();
可能会导致分段错误。
正确和安全的方法是按顺序做正确的事情:
m_process->waitForFinished();
m_process->terminate();