[英]How to correctly free/finalize an ActiveX DLL in Delphi?
我们在这里使用一个称为ODNCServer的类-在初始化时,将创建一个TAutoObjectFactory
对象:
initialization
pAutoObjectFactory := TAutoObjectFactory.Create(ComServer, TODNCServer, Class_ODNCServer, ciSingleInstance, tmApartment);
现在, FastMM抱怨内存泄漏,因为此对象没有在任何地方释放。 如果我添加这样的终结声明
finalization
if assigned(pAutoObjectFactory) then
TAutoObjectFactory(pAutoObjectFactory).Free;
然后释放该对象,但是在弹出有关内存泄漏的FastMM对话框后,实际上,操作系统似乎正在卸载DLL,而不是程序。 ODNCServer
实例是ODNCServer
创建的
fODNCServer := TODNCServer.Create(nil);
//register into ROT
OleCheck(
RegisterActiveObject(
fODNCServer.DefaultInterface, // instance
CLASS_ODNCServer, // class ID
ACTIVEOBJECT_STRONG, //strong registration flag
fODNCServerGlobalHandle //registration handle result
));
并像这样释放:
if ((assigned(fODNCServer)) and (fODNCServerGlobalHandle <> -1)) then
begin
Reserved := nil;
OleCheck(RevokeActiveObject(fODNCServerGlobalHandle,Reserved));
fDTRODNCServerGlobalHandle := -1;
end;
FreeAndNil(fODNCServer);
那么,有人知道我必须做些什么来摆脱内存泄漏吗? 顺便说一句,我还尝试使用FastMM的RegisterExpectedMemoryLeaks
注册并忽略泄漏,但这似乎不起作用。 此外,即使这只是一种解决方法,我也想知道正确的方法。
不用担心 从严格意义上讲,这不是“泄漏”。 是的,您正在创建一个永不释放的对象,但是关键字为“ an”。 单数。
您的应用程序/ DLL不会“泄漏”内存,因为它将创建这些对象的大量实例,并不断增加其内存使用量。 此外,当进程终止时,该单个工厂对象(以及其他类似对象)使用的内存将被清除。
如果显示了用于调用RegisterExpectedMemoryLeak()的代码,则可能可以确定为什么它在您的特定情况下不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.