首页  编辑  

XML DOM COM的内存泄露?

Tags: /超级猛料/XML/   Date Created:

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;