ここでは ODNCServer というクラスを使用しています。初期化時にTAutoObjectFactory
オブジェクトが作成されます。
initialization
pAutoObjectFactory := TAutoObjectFactory.Create(ComServer, TODNCServer, Class_ODNCServer, ciSingleInstance, tmApartment);
現在、このオブジェクトがどこにも解放されていないため、 FastMMはメモリ リークについて不平を言っています。このようなファイナライズステートメントを追加すると
finalization
if assigned(pAutoObjectFactory) then
TAutoObjectFactory(pAutoObjectFactory).Free;
その後、オブジェクトは解放されますが、メモリ リークに関する FastMM ダイアログがポップアップした後、実際には OS がプログラムではなく 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'sRegisterExpectedMemoryLeaks
を使って登録してリークを無視することも試しましたが、これはうまくいかないようです。さらに、たとえそれが単なる回避策であったとしても、これを行う正しい方法を知りたい.