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()
之前在SomeRecord
或SomeRecAr
上使用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)
的任何文档引用。有谁知道在哪里可以找到它?至于问题的第二部分,我认为没有理由不继续使用记录,而是使用动态数组分配它们。尝试自己管理生命周期更容易出错。