開発ブログ - TObjectList<T> のコンストラクタに注意

TObjectList<T> のコンストラクタに注意

カテゴリ : 
技術メモ » Delphi » 全般
執筆 : 
2013/12/26

Generics の TObjectList を使ったプログラムをデバッグしていて気がつきました。
TObjectList のコンストラクタで inherited の書き方によって、動作が違うことがあるの?

書いていたのはこんなコードです。

TDangerObjectList = class(TObjectList<TBar>)
public
  constructor Create;
  destructor Destroy; override;
end;

constructor TDangerObjectList.Create;
begin
  inherited;   // inherited Create; でなければならない!!
end;

destructor TDangerObjectList.Destroy;
begin
  inherited;
end;

コンストラクタで inherited Create と書けば TObjectList.Create が呼ばれますが、 inherited だけ書くと TList.Create が呼ばれてしまうようです。
それって子供たちが解放されないってことですよね?

inherited とだけ書くと、自分と同じシグネチャのメソッドである Create() を呼び出そうとしますが、TObjectList には Create() はありません。(注)
そのため TObjectList の親の TList.Create() が呼ばれてしまうのでしょう。

(注)
TObjectList.Create と書けるじゃないか。と思いますが、実際には
Create(AOwnsObjects: Boolean = True)
が呼ばれているだけで、 Create() はありません。

意外にこの辺りは適当に書いてしまうことがあるので注意しなければ...

  • コメント (0)
  • トラックバック (0)

コメントの投稿

お気軽にコメントください : 投稿されたコメントは承認後に表示されます
プロダクツ

開発ブログ

Link

AD