上篇介紹雙重指標實作 VCL 控制項陣列,網友指出 TList 釋放資源問題。本文提供 TList 正確釋放方案並比較兩種方法優劣。
// 宣告:TList *buttons = new TList;
for (int i = 1; i <= ButtonCount; i++) {
TSpeedButton *spdBtn = new TSpeedButton(this);
spdBtn->Parent = ScrollBox; // 指定父控制項
spdBtn->Caption = IntToStr(i);
spdBtn->Width = 80;
spdBtn->Height = 80;
spdBtn->OnClick = ButtonClick;
spdBtn->Left = intLeft;
spdBtn->Top = intTop;
spdBtn->GroupIndex = 1;
spdBtn->Flat = true;
intLeft += 80 + intSpace;
if (i % LineCount == 0) {
intTop += 80 + intSpace;
intLeft = intSpace;
}
buttons->Add(spdBtn); // 加入 TList
}
int num = buttons->Count;
for (int i = 0; i < num; i++) {
delete (TSpeedButton *)buttons->Items[i]; // 強制轉型後刪除
}
// 最後釋放 TList 本身
delete buttons;
TList->Items 回傳 void*,C/C++ 中 void* 可隱性轉換為任何指標型別。(TSpeedButton*) 強制轉型後呼叫 delete,正確呼叫解構函數並釋放記憶體。(TObject*) 同理可行,因 TObject 為所有 VCL 類別基類,基類指標可指向衍生類物件。| 維度 | 雙重指標 (TButton**) | TList 容器 |
|---|---|---|
| 本質 | 典型 C++ 解法 | C++ Builder / VCL 風格解法 |
| 彈性/效能 | 雙重指標靈活、高效 | 稍低,但可接受 |
| 可讀性 | 多重指標難理解 | 容器介面直觀易懂 |
| 功能豐富度 | 手動管理 | 享有 TList 方法 (排序、搜尋、插入/刪除) |
| 記憶體管理 | 手動 delete[] 陣列 + 逐項 delete | 逐項 delete + delete 容器 |
兩種方法各有優劣:追求極致效能與控制選雙重指標;重視程式碼清晰、維護性與 VCL 整合選 TList。具體採用哪種,視專案需求與個人偏好決定。