- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果您查看 FreeAndNil 过程的代码,您将看到:
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
他们将Nil
分配给对象引用并且仅在销毁它之后的原因是什么?为什么不反之亦然?
最佳答案
我可以想到这样做的两个原因,但似乎都没有令人信服的。
原因 1:保证在引发异常时将引用设置为 nil
实现实现了这一点。如果析构函数引发,则引用仍设置为 nil。另一种方法是使用 finally
block :
try
TObject(Obj).Free;
finally
TObject(Obj) := nil;
end;
这样做的缺点是性能。特别是在 x86 上,try/finally
有点昂贵。在这样一个基本的例程中,谨慎的做法是避免这种开支。
为什么我觉得不惜一切代价去消除的愿望并不令人信服?好吧,一旦析构函数开始失败,你最好放弃。您无法再清楚地推断出程序的状态。您无法判断什么失败了以及您的程序处于什么状态。我认为,面对引发的析构函数,正确的行动方针是终止该进程。
原因2:确保其他线程能够检测到该对象正在被销毁
这又实现了,但没有实际用途。是的,您可以测试是否分配了引用。但然后呢?如果没有同步,另一个线程无法调用该对象的方法。你所能做的就是了解该物体是否还活着。如果是这样,那么这个状态在析构函数运行之前或之后发生变化为什么会很重要?
因此,虽然我将此作为一个可能的原因,但我无法相信内河码头的任何人真的受到这一论点的影响。
关于delphi - 为什么 FreeAndNil 实现在 Free 之前执行 Nil ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26623852/
在我的 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
我是一名优秀的程序员,十分优秀!