var
ComInstrXML: IXMLDocument;
mainNode, childHeadNode, childBodyNode, pNode: IXMLNode;
begin
ComInstrXML := LoadXMLData(const_XmlDocument);
mainNode := ComInstrXML.DocumentElement;
// ... 解析邏輯 ...
Result := ComInstrXML.XML.Text;
end;
疑問:IXMLDocument/IXMLNode 是否需手動釋放?懷疑內存洩漏。
IXMLDocument、IXMLNode 是 **COM 接口** (以 I 開頭),Delphi 對接口類型實現**引用計數**自動內存管理。_Release 調用,引用計數歸零即釋放底層對象。nil 或調用 _Release 屬於**過度操作**,反而易導致雙重釋放/提前釋放錯誤。| 可能原因 | 檢查方法 |
|---|---|
| 全局/靜態變量長期持有接口 | 檢查是否有 var GlobalXML: IXMLDocument 未置 nil |
| 循環引用 (A 子節點持有父節點接口) | XML DOM 樹通常無循環,但業務邏輯若手動構建需注意 |
未釋放的 TXMLDocument 組件 (非接口) | 若用 TXMLDocument.Create(nil) 需 Free,接口版 NewXMLDocument 自動管理 |
| 第三方 COM 組件洩漏 | 用 FastMM4/Deleaker 定位具體分配堆棧 |
function ParseXML(const XmlStr: string): string;
var
Doc: IXMLDocument;
Node: IXMLNode;
begin
Doc := LoadXMLData(XmlStr); // 返回 IXMLDocument,引用計數=1
Node := Doc.DocumentElement; // 返回 IXMLNode,引用計數=1
// ... 讀取屬性/子節點 ...
Result := Doc.XML.Text; // 最後使用 Doc
end; // 函數結束,Doc/Node 離開作用域,自動 _Release,內存釋放
GetHeapStatus.TotalAllocated 變化。結論:**接口類型變量離開作用域自動釋放**,無需手動管理。內存洩漏請用 FastMM4 定位具體對象,勿盲目加 _Release。