今天基于MSXML4.0实现SAX解析XML。但是不知道为什么下面这里不会造成内存泄漏?
var
xmlReader: TSAXXMLReader40;
begin
...
xmlReader := TSAXXMLReader40.Create(self); //后面我没有去Free它,Free了反而出错。
...
end;
用内存检测工具也检测不出内存泄漏。
谁能告诉我这是为什么?
var
xmlReader: TSAXXMLReader40;
begin
...
xmlReader := TSAXXMLReader40.Create(self); //后面我没有去Free它,Free了反而出错。
...
end;
用内存检测工具也检测不出内存泄漏。
谁能告诉我这是为什么?
IVBSAXContentHandler, IVBSAXErrorHandler)这个是我写的类。
也是Create后,不用Free,Free之后反而会出错,然后出现内存泄漏,真奇怪。
还是说使用COM的对象不是我这种用法?
不好意思,我也是前两个月才开始研究面向对象的to: burberry(翔翔)
那本书是刘艺的,出版社我忘了
我说的都是基础,不敢在前辈面前班门弄釜
还是搬个凳子学习听讲
因此不需要你释放,你一定要释放,就
FreeAndNil(theObject);
bee2518兄说:TSAXHandler不能释放的原因真的是“从接口继承下来的类不用释放”。我好像没听过这句话。可有出处?var
xmlReader: TSAXXMLReader40;
saxHandler: TSAXHandler; //这个对象含有一个TObjectList,在Create时被创建
begin
saxHandler := TSAXHandler.Create;
xmlReader := TSAXXMLReader40.Create(self);
try
xmlReader.contentHandler := saxHandler;
xmlReader.errorHandler := saxHandler;
xmlReader.parseURL(edtFile.Text);
finally
//若在这里释放saxHandler反而会出错
end;
end;程序结束后无内存泄漏,是因为每走过一遍这个程序,就会创建一个TSAXHandler。
而这个对象很奇怪,如果我运行这个函数5遍,就会创建了TSAXHandler对象出来,直到程序推出时,才一一被释放。
也就是说,它虽然是一个局部变量,但是内存却被某个东西管理着。我想知道管理它的是什么,是不是COM上面有什么机制,会对继承自TAutoObject的对象进行内存管理?最重要的是,如果我要即时释放这个对象,该怎么办?谁解决了,100分就是他D,谢谢各位大侠。
xmlReader.contentHandler := nil;
xmlReader.errorHandler := nil;
然后才能
saxhandler.free;
xmlReader: TSAXXMLReader40;
saxHandler: TSAXHandler; //这个对象含有一个TObjectList,在Create时被创建
begin
saxHandler := TSAXHandler.Create;
xmlReader := TSAXXMLReader40.Create(self);
try
xmlReader.contentHandler := saxHandler;
xmlReader.errorHandler := saxHandler;
xmlReader.parseURL(edtFile.Text);
finally
//若在这里释放saxHandler反而会出错
end;
end;唉,马甲裤子少了还真被看作入门小菜鸟了。这样的代码写出了,看来你也只能被看作菜鸟了……汗
忘记了具体在哪一章,在阐述TInterfacedObject的时候说过
大意是这样的:
“在接口被置为空的时候,编译器自动加入了释放对象的机器码”TAutoObject继承自TComObject,
TComObject和TInterfacedObject的实现过程是差不多的
同样的释放原理也适用