Remy Lebeau stated说:“不能保证访问nil指针会引发异常。这是未定义的行为。任何事情都可能发生。可能会引发异常,或者您可能只是读取垃圾,或者可能会浪费内存,或者...”。怎么来的? 在哪种情况下,访问NIL对象的方法不会引发AV并导致内存损坏?
// (Obj is any kind of object. Let's say TStringList)
Obj = nil;
Obj.LoadFromFile();
答案 0 :(得分:8)
不能保证访问nil指针会引发一个
是。
但是,实际行为取决于实际代码。
如果您调用动态或虚拟方法以及尝试直接访问实例字段,则会引发异常。
在nil
引用上调用静态方法并对其中的Self
测试nil
是非常安全的。
此类静态方法的最佳示例是Free
。
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
显然,以上行为已得到很好的定义,否则曾经编写的每个Delphi程序都将随机崩溃(或一直崩溃)。
通常,访问nil
引用的字段将导致崩溃。从理论上讲,拥有足够多的课程是可能的。
David Heffernan提供的示例类
type
TSillyExample = class
FStuff: array [0..SomeVeryLargeNumber-1] of Byte;
FAreYouFeelingLucky: string;
end;