微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在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)的任何文档参考.有人知道哪里可以找到吗?

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

原文地址:https://www.jb51.cc/delphi/102636.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐