我想,在这里我遇到了一个棘手的情况。我需要能够释放作为记录字段的对象。如果它是一个类,我通常会在析构函数中编写清理代码。但是由于记录类型不能引入“析构函数”,怎么可能调用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;
认为,
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仍然存在,这会导致内存泄漏......