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

WeG*_*ars 1 delphi

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

// (Obj is any kind of object. Let's say TStringList) 
Obj = nil;
Obj.LoadFromFile();
Run Code Online (Sandbox Code Playgroud)

Dal*_*kar 8

无法保证访问nil指针会引发异常。

真正。

但是,实际行为取决于实际代码。

如果调用动态或虚拟方法以及尝试直接访问实例字段,则会引发异常。

nil引用上调用静态方法并Self对其nil内部进行测试是绝对安全的。

此类静态方法的最佳示例是Free

procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
Run Code Online (Sandbox Code Playgroud)

显然,上述行为已得到很好的定义,否则曾经编写的每个Delphi程序都将随机崩溃(或一直崩溃)。


通常,访问nil参考字段将导致崩溃。从理论上讲,具有足够大的类,一切皆有可能。

David Heffernan提供的示例类

type
   TSillyExample = class
     FStuff: array [0..SomeVeryLargeNumber-1] of Byte;
     FAreYouFeelingLucky: string;
   end;
Run Code Online (Sandbox Code Playgroud)

  • 当您访问悬空指针时,当您访问nil行为时,他所说的内容可能已经定义好了,但是实际结果将取决于代码。 (2认同)
  • 严格来说,这是不正确的。这些字段可以很好地位于有效内存中。字段从接近0的地址开始。如果对象足够大,则可以访问某些字段的地址。 (2认同)