如何在Delphi中正确释放包含各种类型的记录?

前端之家收集整理的这篇文章主要介绍了如何在Delphi中正确释放包含各种类型的记录?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
type
  TSomeRecord = Record
    field1: integer;
    field2: string;
    field3: boolean;
  End;
var
  SomeRecord: TSomeRecord;
  SomeRecAr: array of TSomeRecord;

这是我所拥有的最基本的例子,因为我想重用SomeRecord(某些字段保持为空,没有释放所有的一些字段,当我重用SomeRecord,这显然是不需要的)我正在寻找一个一路释放所有的领域.我已经开始使用字符串[255],并使用ZeroMemory(),这是很好,直到它开始泄漏内存,这是因为我切换到字符串.我仍然缺乏了解为什么的知识,但它似乎与动态有关.我也使用动态数组,所以我假设在任何动态的情况下尝试ZeroMemory()会导致泄漏.有一天浪费了.我想我通过在SomeRecord上使用Finalize()或ZeroMemory()之前的SomeRecAr来解决这个问题,但是我不知道这是正确的方法还是只是我是愚蠢的.

所以问题是:如何一次释放一切?对于这一点,我不知道有一些单一的程序吗?

在另一个注意事项上,或者我可以建议如何实现这些记录不同的开始,所以我不需要做复杂的尝试释放的东西.我已经研究了用New()创建记录,然后摆脱Dispose(),但是当调用Dispose()之后的变量未定义时,我不知道这是什么意思,而不是nil.另外,我不知道某个类型的变量(SomeRecord:TSomeRecord)与指向一个类型的变量(SomeRecord:^ TSomeRecord)之间有什么区别.我正在研究上述问题,除非有人可以快速解释,否则可能需要一些时间.

解决方法

假设您有一个支持在记录上实现方法的Delphi版本,您可以清除以下记录:
type
  TSomeRecord = record
    field1: integer;
    field2: string;
    field3: boolean;
    procedure Clear;
  end;

procedure TSomeRecord.Clear;
begin
  Self := Default(TSomeRecord);
end;

如果你的编译器不支持Default,那么你可以这么做:

procedure TSomeRecord.Clear;
const
  Default: TSomeRecord=();
begin
  Self := Default;
end;

您可能希望避免在方法中突变值类型.在这种情况下创建一个返回空记录值的函数,并使用赋值运算符:

type
  TSomeRecord = record
    // fields go here
    class function Empty: TSomeRecord; static;
  end;

class function TSomeRecord.Empty: TSomeRecord;
begin
  Result := Default(TSomeRecord);
end;

....

Value := TSomeRecord.Empty;

除此之外,我找不到默认(TypeIdentifier)的任何文档参考.有人知道哪里可以找到吗?

对于您的问题的第二部分,我看不出没有理由不继续使用记录,并使用动态数组分配.尝试自己管理一生的时间更容易出错.

猜你在找的Delphi相关文章