为什么释放坏对象指针抛出EPrivilege而不是EAccessViolation?

WeG*_*ars 2 delphi access-violation delphi-xe

EPrivilege - Privileged instruction当我执行此程序而不是Access Violation?时,为什么会得到" " ?

{$Warnings OFF}
procedure TFrmMyTest.mnuCrashMeClick(Sender: TObject);
var t: TStringList;
begin
 FreeAndNil(t);
end;
{$Warnings ON}
Run Code Online (Sandbox Code Playgroud)

我知道我试图释放一个随机指向内存的对象.但我希望获得访问冲突而不是"特权指令".

(不要担心我不打算在真实程序中使用上面的代码.)

Cod*_*aos 9

FreeAndNil调用非虚方法Free.首先检查nil(变量可能不是nil),然后调用虚拟析构函数Destroy.

调用虚方法意味着查看对象的开头以获取虚方法表(VMT).这可能会导致访问冲突.但是如果对象在分配的内存中,它将返回一个未定义的指针作为VMT.

接下来,在距VMT的某个偏移处读取指针大小的值.这再次可以抛出访问冲突或返回未定义的指针.

最后执行该指针指向的内存.如果碰巧包含无效代码,则会得到一些无效指令异常的变体.