如何在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)的任何文档参考.有人知道哪里可以找到吗? 对于您的问题的第二部分,我看不出没有理由不继续使用记录,并使用动态数组分配.尝试自己管理一生的时间更容易出错. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |