我现在的项目中用了XML,使用了TXMLDocument,结果发现我在Create了以后,Free完了内存不释放,后来就在定时器或循环中作了测试,结果发现内存飞快得增加,直到出现虚拟内存不足。代码如下:
procedure TForm1.Timer2Timer(Sender: TObject);
var
  XMLDocument: TXMLDocument;
begin
  CoInitialize(nil);
  try
    XMLDocument := TXMLDocument.Create(self);
    XMLDocument.XML.Clear;
    XMLDocument.Active := True;
    XmlDocument.XML.Text:=XMLDocument1.XML.Text;
    XMLDocument.Active := True;
  finally
    XMLDocument.Free;
    CoUnInitialize;
  end;
end;发现不成后,就改用自动创建在窗体上放一个,所有代码都去掉了,只置一下true,false还是不行,内存依然在涨,到不足,快急死了,大家帮我想想是怎么回事,应该不会是控件本身的缺陷吧procedure TForm1.Button1Click(Sender: TObject);
begin
  while 1<2 do
  begin
    XMLDocument1.Active:=true;
    XMLDocument1.Active:=false;
  end;
end;

解决方案 »

  1.   

    不要用 DELPHI 自带的,用 MSXML;
      

  2.   

    谢谢!
    自带的是不是不太好用
    我也是项目需要第一次使用,MSXML没有资料,能给我一个例子吗
      

  3.   

    这样吧。。
    其实TXMLDocument也是用了MSXML,procedure TForm1.Timer2Timer(Sender: TObject);
    var
      XMLDocument: IXMLDocument;
    begin
      CoInitialize(nil);
      try
     XMLDocument := TXMLDocument.Create(nil);
                                       ~~~~你那程序关键错误就是这儿,这个必须是NIL。
        XMLDocument.XML.Clear;
        XMLDocument.Active := True;
        XmlDocument.XML.Text:=XMLDocument1.XML.Text;
        XMLDocument.Active := True;
       ....
      finally
        XMLDocument:=nil;//这一句不要也可。
        CoUnInitialize;
      end;
    end;当然,在没有安装MSXMLDOM4情况下,
    TXMLDOCUMENT也有些小小的问题,不过可以轻松解决的。
    但不会影响到你的程序。
      

  4.   

    可是这样还是会照涨不误的
    我刚刚试过了帮我测一下OK?
    是不是因为我没有安装MSXMLDOM4
      

  5.   

    halfdream(哈欠) 说得对,
    但用TXMLDocument.Create(nil)是将导致问题:
    修改XMLDocument.encoding等三个属性时会报错,
    我是这样,放一个datamodule:
      XMLDocument:= TXMLDocument.Create(dm);
      FreeAndNil(XMLDocument);内存不断增长的问题装了msxml4以后就不会了,或者用
     halfdream(哈欠) 的办法,很好:http://expert.csdn.net/Expert/topic/2841/2841134.xml?temp=.8972284现在烦恼一扫而空!
       
      

  6.   

    用 MSXML吧,从DELPHI的类型库里可以到入
      

  7.   

    非常感谢大家,问题终于解决了
     listener96(test) 多谢
    halfdream(哈欠)真是厉害
      

  8.   

    可以考虑使用 IXMLDocument 接口来创建对象, 它的内存分配由COM机制自动完成.