你需要free
。
因为Class.Create
只是一个表达式,Delphi 无法知道结果值来自哪个表达式。
您可以只阅读 VCL 源代码 - 总是有明确.Free
的 .
您可以想到非对象示例:
var r: record .... end;
with r do begin
...
end;
如果 Delphi 最后试图释放所有东西with
- 那么它会尝试free
非对象吗?
with SomeObjectFactory.GetMeAnObject do begin
...
end;
在这里,您不是通过构造函数创建对象,而是通过某个函数创建对象。TLabel.Font
并且这个函数与or没有什么不同TDataSet.FieldByName
。Delphi 是否应该free
在这里?
为了避免冒险的猜测并保持一致 -with
是公正的with
。它只是一个别名。而已。它是在 1974 年设计的,并没有克隆最新的 .Net/ScalaUsing(x){..}
结构的功能。
你可能看到的是这样的结构
with TForm.Create(Application) do ...;
with TLabel.Create(MainForm.Panel1) do ...;
这是非常不同的 - 它确实将新创建的控件插入为属于所有者。当它是d 本身时,所有者将free
拥有它所有的组件。free
但这不使用Create(nil)
. 当它仍然存在时 - 然后在with
块内你会看到一些显式调用,将对象绑定到某个容器/父级(尽管在.Create
和绑定之间发生异常的情况下这是非常脆弱的)。