gpt4 book ai didi

delphi - 为什么 Delphi 编译器看不到我正在尝试释放接口(interface)?

转载 作者:行者123 更新时间:2023-12-03 15:07:14 25 4
gpt4 key购买 nike

本周末我在编码时犯了一个小错误。
在下面的代码中,我创建了一个对象并将其转换为接口(interface)。后来,我尝试使用 FreeAndNil();

释放它
type
IMyIntf = interface
[...]
end;

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

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

当然,程序在这一行崩溃了。我完全理解这个问题,但我不明白的是为什么编译器不警告我?后面没有动态的东西,只是我试图释放一个接口(interface)!为什么它不给我写一个错误/警告?

背后是否有任何真正的解释,或者只是编译器的限制?

最佳答案

如您所知,正确的方法是编写 Myintf := nil ,或者只是让它超出范围。您问的问题是为什么编译器接受 FreeAndNil(Myintf)并且在编译时不会提示。

FreeAndNil的声明是

procedure FreeAndNil(var Obj);

这是一个无类型参数。因此它会接受任何东西。您传递了一个接口(interface),但您也可以传递一个整数、字符串等。

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

你可能会想象你可以写

procedure FreeAndNil(var Obj: TObject);

因为所有对象都是 TObject 的后代。但这并不能完成任务。原因是您传递给 var 的对象参数必须与该参数的类型完全相同。如果FreeAndNil是以这种方式声明的,您必须将其强制转换为 TObject每次你调用它时。

因此,设计者决定,解决设计问题的最佳解决方案,也是最不糟糕的选择,是使用无类型的 var 参数。

关于delphi - 为什么 Delphi 编译器看不到我正在尝试释放接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7960510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com