加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi:从什么时候接口引用不再在with-block结束时释放?

发布时间:2020-12-15 09:43:50 所属栏目:大数据 来源:网络整理
导读:我最近偶然发现了一些由我编写的非常旧的代码引起的问题,这显然假设一个with语句中使用的接口引用会在with-block被释放后立即释放 – 有点像一个隐式的try-finally-block(如果我理解的话,类似于C#的using语句. 显然(在Delphi 2009中)这不是(不再是?)的情况.
我最近偶然发现了一些由我编写的非常旧的代码引起的问题,这显然假设一个with语句中使用的接口引用会在with-block被释放后立即释放 – 有点像一个隐式的try-finally-block(如果我理解的话,类似于C#的using语句.

显然(在Delphi 2009中)这不是(不再是?)的情况.有谁知道这发生的时间?或者我的代码开始时是完全错误的?

为了澄清,这是一个简化的例子:

type
  IMyIntf = interface;
  TSomeObject = class(TInterfacedObject,IMyIntf)
  protected
    constructor Create; override; // creates some sort of context
    destructor Destroy; override; // cleans up the context created in Create
  public
    class function GetMyIntf: IMyIntf; //a factory method,calling the constructor
  end;

procedure TestIt;
begin
  DoSomething;
  with (TSomeObject.GetMyIntf) do
    begin
      DoStuff;
      DoMoreStuff;
    end; // <- expected: TSomeObject gets destroyed because its ref.count is decreased to 0
  DoSomethingElse;
end; // <- this is where TSomeObject.Destroy actually gets called

每当有人开始使用旧的“带有邪恶”的论点时,这始终是我心中的一个例子,让我继续“是的,但……”.好像我错了……有人能证实吗?

解决方法

Pascal / Delphi中保留的单词仅用于轻松访问记录或对象/类的成员(即为了不提记录/对象/类的名称).它与C#有很大不同,与垃圾收集有关.自从记录诞生之日起,它就以Pascal语言存在,以简化代码调用许多数据成员(当时简称为“字段”).

总而言之,与垃圾收集,内存释放或对象实例的破坏无关.在with头部构造的对象之前可能已经在单独的代码行中初始化,它们是相同的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读