为什么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参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |