如果我在"with"子句中创建一个对象,我还需要释放它吗?

Pie*_*r B 1 delphi pascal delphi-7 with-statement

在我的源代码中,我经常看到并使用如下构造:

with TSQLDataSet.Create(nil) do try
  //Dosomething, get a result from a query.    
finally
  Free;
end;
Run Code Online (Sandbox Code Playgroud)

但我也经常看到这个结构:

with TSQLDataSet.Create(nil) do begin
  //Dosomething, get a result from a query.    
end;
Run Code Online (Sandbox Code Playgroud)

如果我创建带有contruction的对象,我是否需要释放它们,或者在with-block结束时是自动的?

And*_*and 8

您需要手动释放该对象.它们在块结束时自动释放是正确的with.这一般适用.如果有什么特别的话TSQLDataSet,我不知道.


Ari*_*The 8

你需要free.

因为Class.Create只是一个表达式,Delphi无法知道结果值来自哪个表达式.

你可以阅读VCL资源 - 总是有明确的.Free.

你可以想到非对象的例子:

var r: record .... end;
with r do begin
...
end;
Run Code Online (Sandbox Code Playgroud)

如果Delphi试图在with最后释放所有东西- 那么它会尝试free非对象?

with SomeObjectFactory.GetMeAnObject do begin
...
end;
Run Code Online (Sandbox Code Playgroud)

这里你不是通过构造函数创建对象,而是通过某个函数创建对象 而且这个功能与TLabel.Font或没有区别TDataSet.FieldByName.德尔福应该free在这吗?

为了避免冒险的猜测并保持统一 - with只是with.这只是一个别名.而已.它的设计早在1974年,并没有克隆最新.Net/Scala Using(x){..}结构的功能.


可能看到的是像这样的结构

with TForm.Create(Application) do ...;
with TLabel.Create(MainForm.Panel1) do ...;
Run Code Online (Sandbox Code Playgroud)

这是非常不同的 - 它确实将新创建的控件插入属于所有者.free当它free本身时,所有者将拥有所有自己的组件.但那并没有用Create(nil).当它仍然存在时 - 然后在with块内部,您将看到一些显式调用,将对象绑定到某个容器/父级(尽管在.Create绑定之间的异常情况下这非常脆弱).