我猜这里有一个棘手的情况.我需要能够释放一个记录字段的对象.我通常会在析构函数中编写清理代码,如果它是一个类.但是由于记录类型不能引入"析构函数",如何调用TObject(Field).Free; ?
我预测会有两种用法:
用新的记录替换记录.
我认为这种用法很容易实现.由于记录是值类型,因此它们在赋值时被复制,我可以重载赋值运算符并释放旧记录所拥有的对象.
(编辑:分配重载不能.这对我来说是个新信息..)
退出记录变量定义的范围.
我可以想到一个释放对象的私有方法,这个方法可以手动调用范围激励.但是,这是同一个问题:如何使它更具记录性?这种行为感觉就像一个班级......
这是一个示例(显然不是预期用途):
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;
Run Code Online (Sandbox Code Playgroud)
假设,
FAdditionalData:=TList<Pointer>.Crete;
Run Code Online (Sandbox Code Playgroud)
通过公开访问字段,在记录构造函数中调用或在记录变量范围内手动调用
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;
Run Code Online (Sandbox Code Playgroud)
在退出ButtonClick范围后,rec不再是,但TList仍然保持其存在,导致内存泄漏...