gpt4 book ai didi

delphi - 哪个更好 : Free or FreeAndNil?

转载 作者:行者123 更新时间:2023-12-03 14:32:38 27 4
gpt4 key购买 nike

Free 和 FreeAndNil 之间的基本区别是什么?

FreeAndNil = Free + Nil 吗?

什么时候应该使用 Free,什么时候应该使用 FreeAndNil?

最佳答案

查看

看看实现:

procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;

示例

考虑以下代码:

procedure TForm1.FormCreate(Sender: TObject);
var
bm: TBitmap;
begin
bm := TBitmap.Create;
bm.LoadFromFile('C:\Users\Andreas Rejbrand\Documents\RAD Studio\6.0\Demos\DelphiWin32\VCLWin32\Football\up.bmp');
bm.Free;

if Assigned(bm) then
bm.SaveToFile('C:\Users\Andreas Rejbrand\Desktop\test.bmp')
else
ShowMessage('Cannot save! The bitmap does no longer exist!');
end;

这将在我的桌面上创建错误或无效(空)位图,因为我尝试使用已释放的对象。是的,即使bm已被释放,它仍然是“已分配”的,即bm仍然指向一个内存地址,即使那里没有任何东西(可用)。为了克服这个问题,可以设置bm := nil作为一种保护措施,然后assigned(bm)将返回false,正如人们所希望的那样。或多或少,FreeAndNil(bm)bm.Free 的简写; bm := nil。第一条语句释放所有内存(以及对象使用的操作系统资源、CPU 时间等),并且 bm := nil 将“指针”bm 设置为 nil,这样bm不再指向该对象以前所在的位置,但现在不再是了。这样您(以及像 assigned 这样的例程)就不会被愚弄,相信仍然存在一个位图对象。

讨论

有人说您应该始终使用 FreeAndNil(foo) 而不是 foo.Free。嗯,为什么不呢?附加指令 foo := nil 可能不会花费太多纳秒来执行,而且事实上,assigned(foo) = false 是释放对象的一个​​非常好的属性。但话又说回来,如果您知道自己在做什么,并且知道释放 foo 对象后您将永远不会再使用它,那么您可以坚持只使用 foo.free 。 。实际上,有些人会认为在许多情况下(但不是全部),尝试使用已释放对象的变量本身就是一个错误。 (当然,在某些情况下,您是故意这样做的 - 您有一个对象 foo,有时已分配,有时未分配。)

关于delphi - 哪个更好 : Free or FreeAndNil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3159376/

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