你需要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和绑定之间发生异常的情况下这是非常脆弱的)。