【发布时间】:2012-10-12 14:31:39
【问题描述】:
我猜我遇到了一个棘手的情况。我需要能够释放作为记录字段的对象。如果它是一个类,我通常会在析构函数中编写清理代码。但是既然记录类型不能引入“析构函数”,那怎么可能调用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 仍然存在,这会导致内存泄漏...
【问题讨论】:
-
记录分配不能超载。
-
我不知道这一点(以前从不需要),但我现在知道了:)是的,它无法超载...