web-dev-qa-db-ja.com

TListまたはTObjectListをクリアします

オブジェクトをリストに格納するために何を使用するかについて少し戸惑っています。これまで、TListを使用して、ループ内の各アイテムを解放してきました。次に、TObjectListからこれを自動的に行うFreeを発見しました。それから私はこれをTList.Clearのドキュメントから見ました:

Clearを呼び出してItems配列を空にし、Countを0に設定します。Clearはまた、Items配列を格納するために使用されたメモリを解放し、Capacityを0に設定します。

つまり、基本的には同じです。そう

TListの場合

mylist.Clear;
myList.Free;

TObjectListと同じですか?

myList.Free;

TObjectListはクラスとしてのアイテムにのみ使用できますか、それともレコードを保存できますか?

15

1。 TListは、ClearまたはFreeの両方で要素を解放しません。

aList.Clear;

aList.Count := 0要素を解放せずに、aList.Items[]を設定するだけです。だからあなたはメモリをリークします。そのような明示的な無料が必要になります:

for i := 0 to aList.Count-1 do
  TObject(aList[i]).Free;

しかし、これはTObjectListが行うことです... :)

TObjectListについては、TObjectList.DestroyClearを呼び出していることは言うまでもありません。

そう

aObjectList.Clear;
aObjectList.Free;

とまったく同じです

aObjectList.Free;

2。レコードのリストを格納するには、動的配列を使用できます。

動的配列ラッパー を使用すると、すべてのTListメソッド(およびそれ以上)を取得できます。つまり、Add / Delete / Clear / Count / IndexOf / Find.。

TList/TObjectListには存在しない、組み込みのシリアル化機能(バイナリまたはJSON)、自動ソートおよび比較(RTTIを使用)があります。 Delphi5以降から。

最新バージョンのDelphiでは、サードパーティのライブラリを使用したくない場合は、genericsを使用して動的配列を処理できます。

20
Arnaud Bouchez

それは同じではありませんTList.Clearポインタを格納するために割り当てられたメモリのみを解放し、ポインタが指しているオブジェクトは解放しません。メモリリークを回避するには、これまでと同じように自分でメモリを解放するか、TObjectListを使用する必要があります。

2番目の質問に答えるために、TObjectListはレコードの保存をサポートしていません。その場合は、TList(または他の何か)を使用する必要があります。

11
Ondrej Kelle

最新バージョンのDelphiを使用している場合は、汎用リストを使用することをお勧めします。

今のところ、リストのオブジェクトを使用するときは、おそらく多くのキャストを行う必要があります。一般的なリストを使用すると、もうそれを行う必要はありません。

たとえば、次の場合:

TMyObject = class(TObject);

次に、次のようなリストを作成します。

TMyObjectList = TObjectList<TMyObject>;

EmbarcaderoWikiに次の記事があります。

http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_(Delphi)

8
Birger

ドキュメントが言っていることをもっと注意深く読んでください:

Clearも解放しますItems配列を格納するために使用されるメモリ

配列自体のメモリのみが解放され、配列内の個々の要素によって使用されるメモリは解放されません。

8
Remy Lebeau