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

Delphi 可以保证访问nil指针会引发异常?,delphi,Delphi,Remy Lebeau指出,无法保证访问nil指针会引发异常。这是未定义的行为。任何事情都有可能发生。可能会引发异常,或者您可能只是读取垃圾,或者您可能会丢弃内存,或者。。。。怎么会? 在哪些情况下,访问NIL对象的方法不会引发AV并导致内存损坏 // (Obj is any kind of object. Let's say TStringList) Obj = nil; Obj.LoadFromFile(); 无法保证访问nil指针会引发错误 例外 对 但是,实际行为取决于实际代码 如果

Remy Lebeau指出,无法保证访问nil指针会引发异常。这是未定义的行为。任何事情都有可能发生。可能会引发异常,或者您可能只是读取垃圾,或者您可能会丢弃内存,或者。。。。怎么会? 在哪些情况下,访问NIL对象的方法不会引发AV并导致内存损坏

// (Obj is any kind of object. Let's say TStringList) 
Obj = nil;
Obj.LoadFromFile();
无法保证访问nil指针会引发错误 例外

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

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

在nil引用上调用静态方法并在其中为nil测试Self是完全安全的

这种静态方法的最好例子是免费的

无法保证访问nil指针会引发错误 例外

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

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

在nil引用上调用静态方法并在其中为nil测试Self是完全安全的

这种静态方法的最好例子是免费的


取决于你所说的“访问”是什么意思。@UliGerhardt-我添加了一个例子。相关:我认为这个问题离题了,因为它似乎是“Remy为什么这么说”。你已经得到了关于在这里和你的问题的另外两个版本中使用nil reference的实际问题的答案,如果你想对某个特定的评论进行澄清,请在另一个评论中这样做。另外,我知道这很难相信,但即使是雷米也可能犯了错误,或者在他的评论中选择了一些糟糕的措辞,所以放弃你得到的各种答案而支持这一条评论可能是不公平的。雷米是对的。但在你的问题中,这实际上取决于你对访问意味着什么。如果您的意思是取消引用,那么是的,它将导致AV、GPF或NilPointerException或平台上任何适当的内容。如果您的意思是对nil对象调用一个方法,那么就不那么清楚了。然后,这取决于该方法的功能,是否是虚拟/动态的,等等。因为它没有明确定义,所以称为未定义行为。这取决于你所说的访问是什么意思。@UliGerhardt-我添加了一个例子。相关:我认为这个问题是离题的,因为它似乎是“Remy为什么这么说”。你已经得到了关于在这里和你的问题的另外两个版本中使用nil reference的实际问题的答案,如果你想对某个特定的评论进行澄清,请在另一个评论中这样做。另外,我知道这很难相信,但即使是雷米也可能犯了错误,或者在他的评论中选择了一些糟糕的措辞,所以放弃你得到的各种答案而支持这一条评论可能是不公平的。雷米是对的。但在你的问题中,这实际上取决于你对访问意味着什么。如果您的意思是取消引用,那么是的,它将导致AV、GPF或NilPointerException或平台上任何适当的内容。如果您的意思是对nil对象调用一个方法,那么就不那么清楚了。然后,这取决于该方法的功能,它是否是虚拟/动态的,等等。由于它没有明确定义,因此它被称为未定义行为。我同意你关于自由的观点,也同意BrakNicku关于标题的观点。然而,我认为雷米说的是另外一件事:可能会引发异常,或者你可能只是读垃圾,或者你可能会垃圾内存,或者。在Free的情况下,上述情况都不会发生。当你访问悬挂指针时,他所说的可能会发生,当你访问nil时,行为基本上是定义好的,但实际结果将取决于代码。我同意悬挂指针。但他没有提到一个悬空的指针。他明确表示,不能保证访问NIL指针会引发异常。然后:或者你可能只是读垃圾,或者你可能垃圾记忆严格来说这是不正确的。这些字段完全可以位于有效内存中。字段从接近0的地址开始。如果对象足够大,则可以访问某些字段的地址。type class=TSillyExample FStuff:Byte的数组[0..someverylargenumer-1];祝你好运:绳子;终止但是是的,至少在Windows中,您必须努力工作才能通过扩展到0x0000ffff的虚拟地址空间底部的保留区域。我同意您关于免费的看法,也同意BrakNicku关于标题的看法。然而,我认为雷米说的是另外一件事:可能会引发异常,或者你可能只是读垃圾,或者你可能会垃圾内存,或者。在Free的情况下,上述情况都不会发生。当您访问悬挂指针时,当您访问nil行为时,他所说的可能会发生,但是
实际结果取决于代码。我同意悬空指针。但他没有提到一个悬空的指针。他明确表示,不能保证访问NIL指针会引发异常。然后:或者你可能只是读垃圾,或者你可能垃圾记忆严格来说这是不正确的。这些字段完全可以位于有效内存中。字段从接近0的地址开始。如果对象足够大,则可以访问某些字段的地址。type class=TSillyExample FStuff:Byte的数组[0..someverylargenumer-1];祝你好运:绳子;终止但是是的,至少在Windows中,您必须努力工作才能通过扩展到0x0000ffff的虚拟地址空间底部的保留区域。
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
type
   TSillyExample = class
     FStuff: array [0..SomeVeryLargeNumber-1] of Byte;
     FAreYouFeelingLucky: string;
   end;