是否可以保证访问nil指针会引发异常?

时间:2019-04-29 07:15:12

标签: delphi

Remy Lebeau stated说:“不能保证访问nil指针会引发异常。这是未定义的行为。任何事情都可能发生。可能会引发异常,或者您可能只是读取垃圾,或者可能会浪费内存,或者...”。怎么来的? 在哪种情况下,访问NIL对象的方法不会引发AV并导致内存损坏?

// (Obj is any kind of object. Let's say TStringList) 
Obj = nil;
Obj.LoadFromFile();

1 个答案:

答案 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;