Здесь мы используем класс ODNCServer - при инициализации создается объект TAutoObjectFactory
:
initialization
pAutoObjectFactory := TAutoObjectFactory.Create(ComServer, TODNCServer, Class_ODNCServer, ciSingleInstance, tmApartment);
Теперь FastMM жалуется на утечку памяти, поскольку этот объект нигде не освобожден. Если я добавлю оператор завершения как этот
finalization
if assigned(pAutoObjectFactory) then
TAutoObjectFactory(pAutoObjectFactory).Free;
затем объект освобождается, но после появляется диалоговое окно FastMM об утечке памяти, так что фактически, кажется, ОС выгружает DLL, а не программу. Экземпляры 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
для регистрации и игнорирования утечки, но это, похоже, не работает. Кроме того, даже если это просто обходной путь, и я хотел бы знать, как это сделать правильно.