# Fix-BUG-20260409-0002 > 适用场景:记录某个 BUG 的修复方案、影响评估、验证结果与落地信息。 ## 关联信息 - Fix ID: Fix-BUG-20260409-0002 - 关联 BUG ID: BUG-20260409-0002 - 修复目标: 收紧资源所有权,补齐基础边界防御,修正生命周期与接口语义问题 - 状态:已完成 / 待持续回归 - 负责人:Codex 协作修改 - 分支 / 版本:`master` ## 根因分析 - 根因: - 部分对象持有关系不清晰,析构顺序对 EasyX 上下文敏感。 - `Table / Label` 等基础控件对空状态和动态变化处理不足。 - `MessageBox` 曾通过历史接口越权干预 `Dialog` 初始化。 - 触发条件: - 析构时机 - 空数据 / 列数不一致 - 动态变更文本 - 为什么之前没发现: - 很多问题集中在边界输入和静态结构设计,而非主路径功能 ## 修复方案 - 修复思路: - 收紧资源所有权 - 明确析构顺序 - 给空状态和列数不一致加防御 - 让接口更贴合真实职责 - 关键改动: - `Window` 析构先清空控件树,再 `closegraph()` - `Control / Window / Button / Table` 中一批资源改为明确所有权 - `Table` 增加空状态、列数规范化、分页下限保护、表高计算 - `Label::setText()` 重新计算尺寸并处理旧快照 - `MessageBox` 移除外层 `setInitialization(true)` 调用 - 涉及文件 / 类 / 函数: - `Control.h / Control.cpp` - `Window.h / Window.cpp` - `Button.h / Button.cpp` - `Table.h / Table.cpp` - `Label.cpp` - `MessageBox.cpp` - `TextBox.cpp` - 影响的 API / 行为: - `Button` 回调 setter 语义收正常 - `MessageBox` 不再依赖外层强制初始化 `Dialog` - 关键约束 / 不变量: - 宿主图形上下文必须在控件销毁后再关闭 - 表格行数据必须与表头列数对齐 ## 影响评估 - 影响范围: - 基础控件稳定性与维护性 - 兼容性影响:低 - 行为变化:有(边界输入会被规范化,不再放任异常状态继续传播) - 性能影响:无明显负担 - 回归风险: - 主要集中在表格布局与分页按钮链路 ## 验证结果 - 验证步骤: 1. 编译 `Window / Control / Table / Label / MessageBox / TextBox` 相关文件。 2. 逻辑推演空表头、长行数据、动态文本变化和窗口关闭链路。 3. 在现有测试用例中回归表格和消息框基本功能。 - 验证结果: - 已消除确定性越界和明显生命周期风险。 - 回归检查: - 字符集相关问题暂不在本次修复范围内。 - 验证证据: - 静态审查 + 编译通过 ## 落地信息 - Commit: - `dde570a` 之后的早期工作区修改 - `4a6e153` - `7f8431a` - PR:[可选] - 发布版本:[可选] - 备注:这部分修复多为基础治理,部分早期修改发生在仓库初始化之前