注意:请耐心等待,由于此处和此处的一些讨论以及我在此处和此处报告的一些问题,我感到有点“火爆”。
一些背景
Ye olde(10.4 之前)FreeAndNil看起来像这样:
FreeAndNil(var SomeObject)
Run Code Online (Sandbox Code Playgroud)
新的和新鲜的FreeAndNil看起来是这样的:
FreeAndNil(const [ref] SomeObject: TObject);
Run Code Online (Sandbox Code Playgroud)
IMO 都有其缺点:
FreeAndNil指针、记录和接口编译得很好,但在运行时会产生有趣但通常不需要的效果。(完全狂暴,或者如果幸运的话它会因 EAccessViolation、EInvalidOperation 等而停止。)FreeAndNil像这样调用新的:FreeAndNil(TObject.Create)它会编译甚至运行得很好。我喜欢FreeAndNil在我出错时警告我并提供例如属性而不是字段的旧版本。不确定如果为此FreeAndNil实现提供对象类型属性会发生什么。没试。如果我们将签名更改为 ,FreeAndNil(var SomeObject:TObject)那么它将不允许我们传递任何其他变量类型,然后正是该TObject类型。这也是有道理的,好像不是这样FreeAndNil,人们可以轻松地更改TComponent在例程中作为类型提供的变量,将 var 变量更改为完全不同类型的对象,例如TCollection. 当然FreeAndNil不会做这样的事情,因为它总是将 var 参数更改为 nil。
所以这是FreeAndNil一个特例。
甚至可能特别到足以说服 delphi 添加一个编译器魔术 FreeAndNil实现?投票给任何人?
潜在的解决方法 …
delphi memory-management object-lifetime rad-studio delphi-run-time-library