2012-01-22 22 views
2

爲什麼我在執行此過程時取得「EPrivilege - Privileged instruction」而不是Access Violation爲什麼釋放壞對象指針會拋出EPrivilege而不是EAccessViolation?

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

我知道我嘗試釋放一個隨機指向內存的對象。但我期望得到訪問衝突,而不是「特權指令」。

(別擔心,我不打算在實際程序中使用上面的代碼。)

回答

3

有時你會得到一個訪問衝突,有時你會得到EPrivilege無疑也有其他模式失敗。甚至有時代碼會出現工作,而且崩潰會在稍後發生。這一切都取決於您在Free上撥打t時發生的價值。

9

FreeAndNil調用非虛擬方法Free。首先檢查nil(可能的變量不是nil),然後調用虛擬析構函數Destroy

調用虛擬方法意味着查看對象的開始以獲取虛擬方法表(VMT)。這可能會導致訪問衝突。但是,如果對象在分配的內存中,它將返回一個未定義的指針作爲VMT。

接下來是一個指針大小的值在與VMT的某個偏移處讀取。這再次可以拋出訪問衝突或返回一個未定義的指針。

最後執行該指針指向的內存。如果它碰巧包含無效的代碼,則會得到一些無效指令異常的變體。

相關問題