XML DOM COM的内存泄露?
procedure newDoc;
var
xmlDoc:IXMLDocument;
begin
xmlDoc:= NewXMLDocument;
//此处用xmlDoc._Release; xmlDoc=nil都没用
end;
procedure main;
var
i: integer;
begin
i:= 0;
while i< 1000 do
begin
newDoc;
//此处应释放内存,但没有
Inc(i);
end;
end;
内存占用以每次8k增长,接口不是会自动释放吗?
halfdream(哈欠)
哈哈哈。。追踪了两个多小时,总算力气没有白花。。
也明白为什么eastliangliang(青苹果) 和楼主观察的结果不同。。
追踪过程暂时不在这儿罗索了。
问题在MSXMLDOM。PAS单元CreateDOMDocument函数上面。
它是将几种版本的DOM,按高版本往低版本往下创建,直到成功为止。
楼主可能同我系统里面差不多,没有安装MSXML DOM40,
在创建失败后就会有小小的泄漏。
楼主可以试试把CreateDOMDocument修改一下,重新编译MSXMLDOM单元。
//-------------------------------------------------------------
function CreateDOMDocument: IXMLDOMDocument;
begin
Result := TryObjectCreate([CLASS_DOMDocument40, CLASS_DOMDocument30,
CLASS_DOMDocument26, msxml.CLASS_DOMDocument]) as IXMLDOMDocument;
if not Assigned(Result) then
raise DOMException.Create(SMSDOMNotInstalled);
end;
function TryObjectCreate(const GuidList: array of TGuid): IUnknown;
var
I: Integer;
Status: HResult;
begin
for I := Low(GuidList) to High(GuidList) do
begin
Status := CoCreateInstance(GuidList[I], nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IDispatch, Result);
//当创建XMLDOM4的时候,出现类没注册错误,这时候居然会有内存泄漏..奇怪
//具体先不管它,反正问题已经找着这儿了..应用上已经够了.
if Status = S_OK then Break;
if Status <> REGDB_E_CLASSNOTREG then
OleCheck(Status);
end;
end;