Tri*_*enT 5 delphi crash free interface delphi-xe
我在本周末的编码时犯了一个小错误.
在下面的代码中,我正在创建一个对象并将其强制转换为接口.后来,我试图释放它用FreeAndNil();
type
IMyIntf = interface
[...]
end;
TMyClass = class(TInterfacedObject, IMyIntf)
[...]
end;
var
Myintf : IMyIntf;
begin
Myintf := TMyClass.Create;
[...] // Some process
FreeAndNil(Myintf); // CRASH !!!
end;
Run Code Online (Sandbox Code Playgroud)
当然,程序崩溃在这一行.我完全理解这个问题,但我不明白为什么编译器不会警告我这个问题?没有动态的东西背后,只是我正在尝试释放界面!为什么不给我写错误/警告?
是否有任何真正的解释或仅仅是编译器限制?
Dav*_*nan 10
如您所知,正确的方法是编写Myintf := nil,或者只是让它超出范围.你问的问题是编译器FreeAndNil(Myintf)在编译时接受并且不抱怨的原因.
宣言FreeAndNil是
procedure FreeAndNil(var Obj);
Run Code Online (Sandbox Code Playgroud)
这是一个无类型参数.因此它会接受任何东西.你传递了一个接口,但你可以传递一个整数,一个字符串等等.
设计师为什么选择无类型参数?好吧,他们需要使用一个var参数,因为它的全部目的FreeAndNil是释放对象并设置对象引用nil.这不能通过目标对象的方法来完成,因此var需要独立函数的参数.
你可能会想象你可以写
procedure FreeAndNil(var Obj: TObject);
Run Code Online (Sandbox Code Playgroud)
因为所有物体都来自TObject.但这不起作用.原因是您传递给var参数的对象必须完全是该参数的类型.如果FreeAndNil以这种方式声明,则TObject每次调用它时都必须强制转换.
因此,设计人员认为设计问题的最佳解决方案是最不好的选择,即使用无类型的var参数.
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |