gpt4 book ai didi

Delphi:为什么 FreeAndNil *真正* nil 我的对象?

转载 作者:行者123 更新时间:2023-12-03 15:02:45 27 4
gpt4 key购买 nike

我想将一个对象 A 传递给第二个对象 B,让 B 进行一些处理,最后释放 A,以防不再需要它。下面给出了一个淡化版本。

program Project6;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TMyObject = class(TObject)
public
FField1: string;
FField2: string;
end;
TBigObject = class(TObject)
public
FMyObject: TMyObject;
procedure Bind(var MyObject: TMyObject);
procedure Free();
end;
procedure TBigObject.Bind(var MyObject: TMyObject);
begin
FMyObject := MyObject;
end;
procedure TBigObject.Free;
begin
FreeAndNil(FMyObject);
Destroy();
end;
var
MyObject: TMyObject;
BigObject: TBigObject;
begin
try
MyObject := TMyObject.Create();
BigObject := TBigObject.Create();
BigObject.Bind(MyObject);
BigObject.Free();
if (Assigned(MyObject)) then begin
WriteLn('Set MyObject free!');
MyObject.Free();
end;
ReadLn;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

(别介意糟糕的设计。)现在,我不明白的是为什么 FreeAndNil 实际上会释放 MyObject,但是 Assigned(MyObject)被评估为 true (在 MyObject.Free() 给出 AV)。

有人可以帮助启发我吗?

最佳答案

MyObject 是与字段 FMyObject 不同的变量。而且您只是将字段FMyObjectnil

FreeAndNil 释放指向的对象,nil 是您传入的变量。它不会神奇地发现并 nil 所有其他对象指向您释放的对象的变量。

FreeAndNil(FMyObject); 的作用与:

object(FMyObject).Free();
FMyObject=nil;

(从技术上讲,这并不完全正确,由于无类型 var 参数,到对象的转换是重新解释的转换,但这与这里无关)

这显然只修改了 FMyObject 而不是 MyObject

<小时/>

哦,我刚刚注意到您隐藏了原始的 Free 方法?那太疯狂了。 FreeAndNil仍然使用原来的Free。在您的示例中,这不会影响您,因为您对静态类型 TBigObject 而不是 FreeAndNil 的变量调用 Free。但这是灾难的收据。

您应该重写析构函数Destroy

关于Delphi:为什么 FreeAndNil *真正* nil 我的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8036388/

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