1

ユニットの1つのファイナライズセクションまで追跡したランタイム217エラーが発生します。これはコードです:

finalization
begin
  for I:= 0 to CacheList.Count - 1 do
  begin
    tempRecord := CacheList.Items[I];
    for k := 0 to length(tempRecord.details) - 1 do
    begin
      tempRecord.Details[k].free;
    end;
    tempRecord.free;
  end;
  CacheList.Free;
end;

tempRecordは:

Record = class
 Details : array of CachedDetails;
 key : string;
end;

CachedDetails = class
 EDate : TDateTime;
 A     : Real;
 B     : Real;
 C     : Real;
end;

エラーが発生しても、プロセスは完全に正常に実行されます。そして、ファイナライズ全体をコメントアウトするだけでエラーはなくなりますが、明らかにメモリをリークしたくありません。私は不適切にフリーを呼んでいますか?

4

1 に答える 1

1

それらがリストに属している間、それはリストの無料アイテムへの良いアドバイスではありません。それが一種のTObjectListであるかどうか、およびこのリストがオブジェクトを所有しているかどうかを確認する必要があります。

または、リストからアイテムを抽出して解放します。

finalization
begin
  while CacheList.Count > 0 do
  begin
    tempRecord := CacheList.Extract( CacheList.First );
    for k := 0 to length(tempRecord.details) - 1 do
    begin
      tempRecord.Details[k].free;
    end;
    tempRecord.free;
  end;
  CacheList.Free;
end;

しかし、考えてみると、破棄の責任をRecordクラスに渡し、OwnsObjects = TrueのTObjectListをCacheListすると、最終化コードは次のようになります。

finalization

CacheList.Free;
于 2012-11-18T11:10:14.143 に答える