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增长,接口不是会自动释放吗?
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增长,接口不是会自动释放吗?
解决方案 »
- 安装.dpk文件时提示''is not a valid identifier,是为什么?
- 为什么ListView的自绘事件CusterDrawItem里用文字输出函数速度会很慢?
- 求操作(查询及相关函数)Access数据库之完整语法资料
- BcdAdd在我机器上出现意外,大家可以试试看是不是这个结果!
- 如何根据现有的C/S软件,开发出一个B/S架构的系统?
- 何处有WinMessenger v2.1的原码下载
- 请教一个最最简单的ole参数传递问题..
- 50分问个Delphi关于GDI+图片处理的小问题?
- 请问为什么不能使用这样的方法!
- 谁把Delphi代码优化(二、三)文章贴上来,我就给谁分,文章到立即给分。
- 关于在delphi中使用xml文件如何统计记录的数量
- Installshield & BDE
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;哪有内存泄露?
uses XMLIntf;
它使用的是 XMLIntf 单元的IXMLDocument接口,
就有这种问题。
怎么办好呢? 我可不想手工来写这么多代码啊。
我这里循环一千次(点一下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;
开始是好象显示一直上升,但过一会儿,特别是最小化窗体这样刷新一下,
就会观察到内存降下来。我又去察看过TXMLDOCUMENT代码,它里面应该没有内存泄漏问题。
最小化时内存并没释放,可以观察三个数字
1。进程的内存使用
2。进程的虚拟内存使用
3。系统总的内存使用
其实下降的是第一个(物理内存),而第二个数字上升了(交换了);
第三个数字保持不变或稍微下降(可以忽略不计)。to eastliangliang(青苹果) :
你所运行的可能是 Kingron(单身走我路……)提供的那段代码,
方法不同,确实是没有问题。我非常希望解决这个问题,所以在这里一再烦扰大家,请见谅。
也许是NewXMLDocument这个函数有问题?
var
xmlDoc:IXMLDocument;
begin
xmlDoc:= TXMLDocument.Create(nil);
xmlDoc.Active:=true; //如果把这句去掉。每次调用都能完全释放。
xmlDoc:=nil;TXMLDocument里面组件与组件关系比较复杂,明天再花点功夫追踪一下。
也明白为什么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;
我昨晚升级到msxml4后内存泄漏也就消失了,
升级到msxml3sp4都不行。