# 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：[可选]
- 发布版本：[可选]
- 备注：这部分修复多为基础治理，部分早期修改发生在仓库初始化之前
