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增长,接口不是会自动释放吗?

解决方案 »

  1.   

    uses MSXML;procedure newDoc;
    var
        xmlDoc:IXMLDOMDocument;
    begin
       xmlDoc:= CoDOMDocument.Create;
       xmlDoc := nil;
        //此处用xmlDoc._Release; xmlDoc=nil都没用
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
        i: integer;
    begin
        i:= 0;
        while i< 1000 do
        begin
           newDoc;
            //此处应释放内存,但没有
           Inc(i);
        end;
    end;哪有内存泄露?
      

  2.   

    MSXML 的接口的确如此,但delphi的怎么办?
    uses XMLIntf;
      

  3.   

    是这样,我用到了delphi自动生成的xml data binding 产生的代码,
    它使用的是 XMLIntf 单元的IXMLDocument接口,
    就有这种问题。
    怎么办好呢? 我可不想手工来写这么多代码啊。
      

  4.   

    打开任务管理器,对比以下运行前后(点button前后)的内存占用量,
    我这里循环一千次(点一下button)内存升5M多,
    单次有时不增内存,如增定是8k,很有规律,用在
    项目里面不死才怪,怎么是好啊?implementation
       uses XMLIntf, XMLDoc;
    {$R *.dfm}
    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;procedure TForm1.Button1Click(Sender: TObject);
    begin
      main;
    end;
      

  5.   

    楼主。。在任务管理器里面观察所用内存。。
    开始是好象显示一直上升,但过一会儿,特别是最小化窗体这样刷新一下,
    就会观察到内存降下来。我又去察看过TXMLDOCUMENT代码,它里面应该没有内存泄漏问题。
      

  6.   

    to halfdream(哈欠) :
    最小化时内存并没释放,可以观察三个数字
    1。进程的内存使用
    2。进程的虚拟内存使用
    3。系统总的内存使用
    其实下降的是第一个(物理内存),而第二个数字上升了(交换了);
    第三个数字保持不变或稍微下降(可以忽略不计)。to eastliangliang(青苹果) :
    你所运行的可能是 Kingron(单身走我路……)提供的那段代码,
    方法不同,确实是没有问题。我非常希望解决这个问题,所以在这里一再烦扰大家,请见谅。
    也许是NewXMLDocument这个函数有问题?
      

  7.   

    代码用的是你提供的那段,在newDoc内对xmlDoc没有写任何释放代码,点了20次按钮后,内存涨了16k,又点了20次,涨了4k,又点了20次,涨了52k,虽然涨点,但没有一次8k那么有规律。没继续测,因为看见一个进程叫mslaugh.exe,靠,冲击波,我重起杀毒先:)
      

  8.   

    好象是有点问题。
    var
      xmlDoc:IXMLDocument;
    begin
       xmlDoc:= TXMLDocument.Create(nil);
       xmlDoc.Active:=true; //如果把这句去掉。每次调用都能完全释放。
       xmlDoc:=nil;TXMLDocument里面组件与组件关系比较复杂,明天再花点功夫追踪一下。
      

  9.   

    哈哈哈。。追踪了两个多小时,总算力气没有白花。。
    也明白为什么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;
      

  10.   

    多谢,多谢大家
    我昨晚升级到msxml4后内存泄漏也就消失了,
    升级到msxml3sp4都不行。