| 分支 | 根類 | 創建 | 釋放 | 適用場景 |
| VCL/傳統 | TObject | Constructor (通常 Create) | Free / FreeAndNil | UI 控件、業務對象、數據模塊 |
| COM/介面 | TInterfacedObject | Constructor | 介面變量離開作用域自動 _Release | 插件、跨模塊、需引用計數場景 |
關鍵規則:Owner 機制
Create(AOwner):指定 Owner → Owner 銷毀時自動 Free 所有擁有的組件。
Create(nil):無 Owner → 必須手動 Free,否則洩漏。
FreeAndNil(Obj):SysUtils 提供,釋放後置 nil,防雙重釋放/野指針,強烈推薦。
特殊容器:TList 指針陷阱
TList 只存指針,不知曉指針指向什麼,銷毀時不會釋放指針指向的內存/對象。必須手動遍歷釋放:
for i := 0 to List.Count - 1 do
TObject(List[i]).Free; // 或 FreeMem 視具體類型
List.Free;
現代代碼請改用 TObjectList<T> (OwnsObjects=True) 或 TList<T> 配合自定義釋放邏輯。
內存管理決策流程圖(文字版)
需要存儲數據
│
├─ 是固定大小、無引用語義? → 用 Record/Static Array/標量 → 自動管理
│
├─ 是可變長文本/字節/集合? → 用 String/Dynamic Array/Bytes → 托管自動
│
├─ 需跨模塊/進程共享、多態換裝? → 用 Interface → 引用計數自動
│
├─ 需要繼承、虛方法、事件、VCL 树? → 用 TObject 類 → 手動 Free / Owner
│
└─ 需要原始內存塊、C API 互操作、極致性能? → 用 Pointer/GetMem → 手動 FreeMem
五大避坑鐵律
- 誰分配誰釋放:函數返回指針/對象,文檔必須註明調用方負責釋放。
- 釋放即置 nil:統一用
FreeAndNil,消滅野指針。
- 異常安全:
try..finally 保護所有手動資源,或用介面/記錄包裝 RAII。
- Owner 鏈清晰:UI 控件必須有 Owner (Form/Frame),非 UI 業務對象明確文檔所有權。
- 工具輔助:FastMM4 FullDebugMode、
ReportMemoryLeaksOnShutdown := True、CodeGuard、LeakCheck 開啟調試構建檢測洩漏。
總結
Delphi 內存管理不是「全自動」也不是「全手動」,而是分層語義化:值類型/托管類型交給編譯器,指針/對象交給開發者(輔以 Owner 機制)。內記「棧上自動、堆上托管、對象手動、Owner 托底」,外用 FreeAndNil + FastMM4 調試,即可在無 GC 語言中寫出穩健、高性能、無洩漏的系統級應用。
- 上一篇文章: Delphi 剪貼簿基礎 (1):文本操作全解析(AsText/SetTextBuf/GetTextBuf)
- 下一篇文章: Delphi 介面編程 (5):同一介面、不同實現——多態的本質
Copyright ©
程式碼之家 All Rights Reserved