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

为什么Delphi编译器看不到我试图释放一个接口?

发布时间:2020-12-15 04:17:03 所属栏目:大数据 来源:网络整理
导读:我在本周末的编码时犯了一个小错误. 在下面的代码中,我正在创建一个对象并将其强制转换为接口.后来,我试图用FreeAndNil()释放它; type IMyIntf = interface [...] end; TMyClass = class(TInterfacedObject,IMyIntf) [...] end;var Myintf : IMyIntf;begin M
我在本周末的编码时犯了一个小错误.
在下面的代码中,我正在创建一个对象并将其强制转换为接口.后来,我试图用FreeAndNil()释放它;
type
  IMyIntf = interface
     [...]
  end;

  TMyClass = class(TInterfacedObject,IMyIntf)
     [...]
  end;

var
  Myintf : IMyIntf;
begin
  Myintf := TMyClass.Create;
  [...] // Some process
  FreeAndNil(Myintf); // CRASH !!!
end;

当然,程序崩溃在这一行.
我完全理解这个问题,但我不明白为什么编译器不会警告我这个问题?没有动态的东西背后,只是我正在尝试释放界面!为什么不给我写错误/警告?

是否有任何真正的解释或仅仅是编译器限制?

解决方法

如您所知,正确的方法是编写Myintf:= nil,或者只是让它超出范围.你问的问题是编译器接受FreeAndNil(Myintf)并且在编译时没有抱怨的原因.

FreeAndNil的声明是

procedure FreeAndNil(var Obj);

这是一个无类型参数.因此它会接受任何东西.你传递了一个接口,但你可以传递一个整数,一个字符串等等.

设计师为什么选择无类型参数?好吧,他们需要使用var参数,因为FreeAndNil的整个目的是释放对象并将对象引用设置为nil.这不能通过目标对象的方法来完成,因此需要独立函数的var参数.

你可能会想象你可以写

procedure FreeAndNil(var Obj: TObject);

因为所有对象都来自TObject.但这不起作用.原因是您传递给var参数的对象必须完全是该参数的类型.如果以这种方式声明FreeAndNil,则每次调用它时都必须强制转换为TObject.

因此,设计人员认为设计问题的最佳解决方案是最不好的选择,即使用无类型的var参数.

(编辑:李大同)

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

    推荐文章
      热点阅读