読者です 読者をやめる 読者になる 読者になる

TInterfacedObjectとinterfaceを使ってオブジェクトを自動的に開放する

メモ。TInterfacedObjectとinterfaceの使い方。
TInterfacedObjectを継承し、interfaceで参照している場合、参照カウント方式で自動的にオブジェクトは開放される。
試したDelphiのバージョンはXE3。

interfaced_object.dpr

program interfaced_object;

{$APPTYPE CONSOLE}

type
  IFoo = interface
    procedure Say;
  end;

  TFoo = class(TInterfacedObject, IFoo)
  public
    procedure Say;
  end;

procedure TFoo.Say;
begin
  Writeln('Hello, world!');
end;

var
  // TFooだと明示的な開放が必要
  // IFooだと参照カウントで自動的に開放
  Foo: IFoo;

begin
  // 終了時にメモリリークをレポートする
  ReportMemoryLeaksOnShutdown := True;
  Foo := TFoo.Create;
  Foo.Say;
  // Freeを呼ばない
end.

IFooで参照していることに注意する。TFooだと開放されずにメモリリークとして検出される。
明示的な開放が不要なのは楽だけど、プロパティが使えなかったりと少し不便。
functionでそれっぽく振舞わせてどうにかするか、参考ページのように参照カウント,開放周りをいじるかは必要になりそう。

実行結果

>dcc32 interfaced_object.dpr
>interfaced_object.exe
Hello, world!