- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将一个对象 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
不同的变量。而且您只是将字段FMyObject
nil
。
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/
在我的 Delphi7 中这段代码 var MStr: TMemoryStream; ... FreeAndNil(MStr); MStr.Size:=0; 生成 AV:模块“Project1.exe
Free 和 FreeAndNil 之间的基本区别是什么? FreeAndNil = Free + Nil 吗? 什么时候应该使用 Free,什么时候应该使用 FreeAndNil? 最佳答案 查看
注意:请耐心等待,由于对 here 的一些讨论,我感到有点“被烤焦”了。和 here以及我报告的一些问题 here和 here . 一些背景 老叶(10.4 之前)FreeAndNil看起来像这样:
我已阅读A case against FreeAndNil但仍然不明白为什么我不能在类析构函数中使用此方法?谁能解释一下。 更新:我认为来自 Eric Grange 的评论对我来说最有用。该链接显示,
我怀疑 FreeAndNil 是否是处理对象的理想方法。我遇到过类似的代码 StringList1.Free; StringList1 := Nil; 被使用。上面的行是矫枉过正,还是更好的做事方式?
我想将一个对象 A 传递给第二个对象 B,让 B 进行一些处理,最后释放 A,以防不再需要它。下面给出了一个淡化版本。 program Project6; {$APPTYPE CONSOLE} use
这个问题已经有答案了: 已关闭13 年前。 Possible Duplicate: Which is preferable: Free or FreeAndNil? 何时使用 free 和 freea
如果您查看 FreeAndNil 过程的代码,您将看到: procedure FreeAndNil(var Obj); var Temp: TObject; begin Temp := TOb
我是一名优秀的程序员,十分优秀!