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

标签 delphi delphi-7 pascal with-statement

在我的资料中,我经常看到并使用这样的结构:

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

但我也经常看到施工:
with TSQLDataSet.Create(nil) do begin
  //Dosomething, get a result from a query.    
end;

如果我创建带有结构的对象,我需要释放它们还是在 with block 的末尾自动释放它们?

最佳答案

您需要 free .

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

您可以只阅读 VCL 源代码 - 总是有明确的 .Free .

您可以想到非对象示例:

var r: record .... end;
with r do begin
...
end;

如果 Delphi 试图释放 with 上的所有内容end - 然后它会尝试 free非对象?
with SomeObjectFactory.GetMeAnObject do begin
...
end;

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

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

你可能看到的是这样的结构
with TForm.Create(Application) do ...;
with TLabel.Create(MainForm.Panel1) do ...;

这是非常不同的 - 它确实将新创建的控件插入为属于所有者。业主会free它拥有的所有组件free d 本身。但这不使用 Create(nil) .当它仍然存在时 - 然后在 with 中阻止您会看到一些显式调用,将对象绑定(bind)到某个容器/父级(尽管在 .Create 和绑定(bind)之间的异常情况下这非常脆弱)。

关于delphi - 如果我在 "with"子句中创建一个对象,我还需要释放它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12642524/

相关文章:

delphi - TStoredProc 中的参数数量有限制吗?

delphi - WinInet+SSL : Can't make abbreviated SSL handshake

delphi - 是否可以配置构建配置以自动添加目标平台的后缀?

delphi - 如何按第一个数字对列表进行排序?

delphi - 将对象引用作为接口(interface)传递

delphi - 用于更改单位名称及其所有引用的工具

windows - 当值仅使用默认名称时,如何在 Inno Setup 中获取注册表值?

delphi - 什么是 Delphi/AppMethod BindSourceDB 范围映射以及如何使用它们?

delphi - 是否可以将整个 const block 标记为已弃用?

delphi - 快速排序戏剧