ここで私はトリッキーな状況にあると思います。レコードのフィールドであるオブジェクトを解放できる必要があります。クラスの場合、通常はデストラクタでクリーンアップコードを記述します。しかし、レコードタイプは「デストラクタ」を導入できないため、TObject(Field).Freeを呼び出すことはどのように可能でしょうか。?
私が予測する使用法には2つのタイプがあります。
レコードを新しいものと交換します。
この使い方は簡単に実装できると思います。レコードは値型であり、代入時にコピーされるため、代入演算子をオーバーロードして、古いレコードが所有するオブジェクトを解放できます。
(編集:割り当てのオーバーロードはできませんでした。それは私にとって新しい情報です。。)
レコード変数が定義されたスコープを終了します。
オブジェクトを解放するプライベートメソッドを考えることができます。このメソッドは、スコープの励起時に手動で呼び出すことができます。しかし、ここに同じ質問があります:それをより記録的にする方法は?この振る舞いはクラスのように感じます...
これがサンプルです(そして明らかに意図された使用法ではありません):
TProperties = record
... some other spesific typed fields: Integers, pointers etc..
FBaseData: Pointer;
FAdditionalData: TList<Pointer>;
//FAdditionalData: array of Pointer; this was the first intended definition
end;
推定、
FAdditionalData:=TList<Pointer>.Crete;
レコードコンストラクタで呼び出されるか、レコード変数スコープで手動で呼び出されます。
procedure TFormX.ButtonXClick(Sender: TObject);
var
rec: TProperties;
begin
//rec:=TProperties.Create(with some parameters);
rec.FAdditionalData:=TList<Pointer>.Create;
//do some work with rec
end;
ButtonClickスコープを終了した後、recはなくなりましたが、TListはその存在を維持しているため、メモリリークが発生します...