相关疑难解决方法(0)

Delphi FreeAndNil:寻找替代实现

注意:请耐心等待,由于此处此处的一些讨论以及我在此处此处报告的一些问题,我感到有点“火爆”

一些背景

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 等而停止。)
  • 新的接受一个 const 参数,因此任何对象。但是随后提供的对象指针实际上是使用一些古怪的代码更改的。
  • 你现在可以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

4
推荐指数
1
解决办法
813
查看次数