1

ここでは 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を使って登録してリークを無視することも試しましたが、これはうまくいかないようです。さらに、たとえそれが単なる回避策であったとしても、これを行う正しい方法を知りたい.

4

1 に答える 1

1

ご心配なく。厳密な意味での「漏れ」ではありません。はい、解放されないオブジェクトを作成していますが、キーワードは「an」です。特異な。

アプリケーション/DLL は、これらのオブジェクトの多数のインスタンスを作成するという意味でメモリを「リーク」せず、メモリ使用量を継続的に増やします。さらに、その単一のファクトリ オブジェクト (およびその他の同様のオブジェクト) によって使用されるメモリは、プロセスがとにかく終了するとクリーンアップされます。

RegisterExpectedMemoryLeak()を呼び出すために使用しているコードを示した場合、特定のケースで機能しない理由を特定できる可能性があります。

于 2009-11-26T19:33:42.340 に答える