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)
无法保证访问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)
| 归档时间: |
|
| 查看次数: |
125 次 |
| 最近记录: |