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)之间有什么区别.我正在研究上述问题,除非有人可以快速解释,否则可能需要一些时间.
解决方法
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)的任何文档参考.有人知道哪里可以找到吗?
对于您的问题的第二部分,我看不出没有理由不继续使用记录,并使用动态数组分配.尝试自己管理一生的时间更容易出错.