[Delphi] ジェネリックのTListに格納したrecord型変数は解放する必要が無い

表題の通り、「ジェネリックのTListに格納したrecord型変数は解放する必要が無い」らしい。

従来型のTListだと下記のサンプルのようにrecord型変数を、TList.Addする際にNewで生成して格納して、TList.Delete(remove?)する際に格納していたrecord型変数をDisposeする必要があった。

type
   TMyRec = record
      ID: integer;
      Name: string;
   end;
   PMyRec = ^TMyRec;

var
   List:TList;
   i: integer;
   myrec: PMyRec;
begin
   List := TList.create;

   // データサンプルを作成してListに持ってもらう
   for i := 0 to 99 do
   begin
      new(myrec);
      myrec^.name := intToStr(random(99999));
      myrec^.ID := i;
      List.add(myrec);
   end;

   // データの使用例
   for i:= 0 to List.Count-1 do
   begin
      ListBox1.items.add(Format(’ID:%5.5d, Name=%s’,
                         [PMyRec(List[i])^.ID), PMyRec(List[i])^.Name]);
   end;

   // 使い終わったら必ず個々のデータもTListも解放
   for i:= 0 to List.count-1 do dispose(PMyRec(List[i]));
   List.free;
end;

しかし、ジェネリックだとNewやDisposeは不要でそのまま使えると言うことらしい。便利になったな。

しかし、基本的にTListを使う際には継承してして独自クラスを作ってから使うんだけどジェネリックのTListはDeleteがオーバーライドできない。
classを格納する場合はどうしたら良いのかな?とふと疑問が湧いた…。
Delphi付属のジェネリッククラスは、使い方がよくわからん。ソートとかの実装方法が直感的にわからなかった。

Delphi 2010, XE だと delphi-coll というサイトで公開されているジェネリッククラス群もあるみたい。

コメント (0件)


くろねこ研究所
http://www.blackcatlab.com/article.php/ProgramingFAQ_del0085