From bc001efec804465234ae77fc7f327c9951a36059 Mon Sep 17 00:00:00 2001 From: dengzhongyuan365-dev Date: Sat, 10 Oct 2026 10:53:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0/=E7=A7=BB=E9=99=A4=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=97=B6=E5=BA=94=E7=94=A8=E5=B4=A9=E6=BA=83?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cancelOperation()中调用m_pArchiveJob->kill()后,kill()通过DirectConnection 同步触发slotJobFinished(),该槽函数将m_pArchiveJob置为nullptr并调用 deleteLater()。控制权返回cancelOperation()后,继续对已置空的m_pArchiveJob 调用deleteLater()导致空指针解引用崩溃。 修复方案:在kill()之前保存当前job指针到局部变量,kill()之后检查m_pArchiveJob 是否仍指向同一job。若slotJobFinished()已清理指针(kill成功),跳过冗余清理; 若kill失败(m_pArchiveJob未变),照常执行deleteLater()和置空。使用指针比较 而非简单null check,可防止slotJobFinished()的signalJobFinished监听者同步 启动新操作替换m_pArchiveJob时误删新job。 Log: 修复取消操作时空指针解引用崩溃 PMS: bug-378823 --- src/source/archivemanager/archivemanager.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/source/archivemanager/archivemanager.cpp b/src/source/archivemanager/archivemanager.cpp index cab1e97aa..4c4f3dd53 100644 --- a/src/source/archivemanager/archivemanager.cpp +++ b/src/source/archivemanager/archivemanager.cpp @@ -453,9 +453,12 @@ bool ArchiveManager::cancelOperation() // 调用job取消接口 if (m_pArchiveJob) { qDebug() << "Canceling archive job"; + ArchiveJob *job = m_pArchiveJob; m_pArchiveJob->kill(); - m_pArchiveJob->deleteLater(); - m_pArchiveJob = nullptr; + if (m_pArchiveJob == job) { + m_pArchiveJob->deleteLater(); + m_pArchiveJob = nullptr; + } return true; }