記事カテゴリ

ユーザー機能


 2024年3月29日(金) 22:39 JST

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

  • 投稿者:
  • 表示回数
    16,577

表題の通り、「ジェネリックの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 というサイトで公開されているジェネリッククラス群もあるみたい。

トラックバック

このエントリのトラックバックURL:
https://www.blackcat.xyz/trackback.php/ProgramingFAQ_del0085
  • [Delphi] ジェネリックのTListに格納したrecord型変数は解放する必要が無い
  • 0 コメント
  • アカウントの登録

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。