type
  TSomeRecord = Record
    field1: integer;
    field2: string;
    field3: boolean;
  End;
var
  SomeRecord: TSomeRecord;
  SomeRecAr: array of TSomeRecord;

这是我拥有的最基本的示例,由于我想重用SomeRecord(某些字段保持为空,而又不释放所有内容,当我重用SomeRecord时,某些字段将被结转,这显然是不希望的),因此我正在寻找一次释放所有字段的方法。我开始使用string[255]并使用了ZeroMemory(),这很好,直到它开始泄漏内存,这是因为我切换到了string。我仍然缺乏了解为什么的知识,但似乎与它的动态性有关。我也使用动态数组,因此我假设在任何动态对象上尝试ZeroMemory()都会导致泄漏。浪费了一天的时间。我想我通过在Finalize()之前在SomeRecordSomeRecAr上使用ZeroMemory()来解决了这个问题,但是我不确定这是正确的方法还是只是我很愚蠢。

所以问题是:如何一次释放所有内容?为此,我根本不知道有一些单一的过程吗?

从另一个 Angular 来说,或者,我将对如何从一开始就以不同方式实现这些记录的建议持开放态度,因此,我无需为释放内容而进行复杂的尝试。我已经研究过使用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;

顺便说一句,我找不到Default(TypeIdentifier)的任何文档引用。有谁知道在哪里可以找到它?

至于问题的第二部分,我认为没有理由不继续使用记录,而是使用动态数组分配它们。尝试自己管理生命周期更容易出错。

10-08 09:23