小编The*_*iEn的帖子

如何释放记录中的对象?

我猜这里有一个棘手的情况.我需要能够释放一个记录字段的对象.我通常会在析构函数中编写清理代码,如果它是一个类.但是由于记录类型不能引入"析构函数",如何调用TObject(Field).Free;

我预测会有两种用法:

  1. 用新的记录替换记录.

    我认为这种用法很容易实现.由于记录是值类型,因此它们在赋值时被复制,我可以重载赋值运算符并释放旧记录所拥有的对象.

    (编辑:分配重载不能.这对我来说是个新信息..)

  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;
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仍然保持其存在,导致内存泄漏...

delphi record

9
推荐指数
1
解决办法
4342
查看次数

标签 统计

delphi ×1

record ×1