Skip to content

[6210] 修复删除 AI 会话时崩溃的问题 - #4694

Merged
PinkMagicFly merged 1 commit into
mainfrom
pigmagicfly/6210/fix-ai-chat-delete-crash
Sep 29, 2026
Merged

PinkMagicFly merged 1 commit into
mainfrom
pigmagicfly/6210/fix-ai-chat-delete-crash

Conversation

@PinkMagicFly

Copy link
Copy Markdown
Contributor

问题

通过 Chat 标签页会话列表条目右侧「…」菜单删除 AI 会话(单删或「Delete selected」多删)时,应用崩溃。

原因

「…」按钮的 clicked 槽内以 QMenu menu (btn) 在栈上构造菜单,父对象为 moreButton(itemWidget 的孙控件)。用户选择「删除」后 emit deleteRequested 同步走完 ChatController::onDeleteRequested → removePanel → removeItem → destroyItem 链,而 destroyItem 对 itemWidget 执行同步 delete:

  • Qt 子对象级联会一路销毁 sidebarButton → moreButton → 其子对象——包括栈上的 QMenu,对栈地址执行 delete 导致堆损坏;
  • 同时销毁了尚处于自身 clicked 信号派发栈帧中的发送者按钮,槽返回后 use-after-free。

修改

  • ChatSidebar::destroyItem:同步 delete 改为 deleteLater(),与同文件 removePanel 既有做法一致。条目仍立即从列表移除(hide + setParent (nullptr) + items_.erase),仅内存销毁推迟到事件循环。destroyItem 是侧边栏条目的唯一共享拆除路径,单删、多删及未来任何移除触发点均被覆盖。
  • 新增回归测试 test_removeItem_from_more_menu_frame_defers_destruction:复现生产链路(以 moreButton 为父的栈上 QMenu + 槽内同步 removeItem),断言信号派发帧返回前发送者存活、控制权回到事件循环后才真正销毁。旧实现跑此用例会因堆损坏崩溃。

验证

  • xmake b qt_chat_tab_widget_test && xmake r qt_chat_tab_widget_test:132 通过 / 0 失败(含新增回归用例)
  • gf fmt --changed-since=main:无遗留格式问题
  • 手动验证(用户完成):单删、多选删除会话均不再崩溃,条目正常消失
  • 用户二次验证

🤖 Generated with Claude Code

@da-liii da-liii left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@PinkMagicFly
PinkMagicFly merged commit 0a6b827 into main Sep 29, 2026
6 checks passed
@PinkMagicFly
PinkMagicFly deleted the pigmagicfly/6210/fix-ai-chat-delete-crash branch September 29, 2026 03:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants