開発ブログ - TObjectList<T> のコンストラクタに注意
Generics の TObjectList を使ったプログラムをデバッグしていて気がつきました。
TObjectList
書いていたのはこんなコードです。
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
それって子供たちが解放されないってことですよね?
inherited とだけ書くと、自分と同じシグネチャのメソッドである Create() を呼び出そうとしますが、TObjectList には Create() はありません。(注)
そのため TObjectList の親の TList.Create() が呼ばれてしまうのでしょう。
(注)
TObjectList.Create と書けるじゃないか。と思いますが、実際には
Create(AOwnsObjects: Boolean = True)
が呼ばれているだけで、 Create() はありません。
意外にこの辺りは適当に書いてしまうことがあるので注意しなければ...