【发布时间】:2011-12-23 14:19:47
【问题描述】:
我想将对象 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)。
有人可以帮我解惑吗?
【问题讨论】:
-
你应该重命名你的方法
Free!在TObject中已经声明了这样的方法。覆盖Destroy并在里面调用inherited会好得多。 -
@Uwe:是的,这是一个糟糕的、糟糕的名字选择。 :) 不过,由于您和其他人的众多评论/回答,我宁愿让它保持原样。谢谢!
-
简单回答:对象不能被 niled,只有对对象的引用可以:)
-
更简单的代码示例;
A := B; B := nil;注意,现在只有 B 是nil,不一定是 A。