什么是AccessViolationException
試圖讀寫受保護內存時引發的異常。
- 繼承
說明
當非托管代碼或不安全代碼嘗試對尚未分配的或不具有訪問權限的內存進行讀寫操作時, 會發生訪問沖突。 出現這種情況通常是因為指針具有錯誤的值。 並非所有通過無效指針的讀或寫操作都會導致訪問沖突,所以訪問沖突通常指示已經通過無效指針進行多次讀或寫操作,並且內存內容可能已損壞。 因此, 訪問沖突幾乎總是指示嚴重的編程錯誤。 AccessViolationException清楚地識別這些嚴重錯誤。
在完全由可驗證托管代碼組成的程序中, 所有引用要么有效要么為 null, 並且不可能訪問沖突。 任何嘗試在可驗證代碼中引用空引用的操作都會引發NullReferenceException異常。 僅AccessViolationException當可驗證托管代碼與非托管代碼或不安全的托管代碼進行交互時才會發生。
AccessViolationException異常只能出現在不安全的托管代碼中, 或在可驗證托管代碼與非托管代碼交互時出現:
-
在不安全的托管代碼中發生的訪問沖突可以表示為NullReferenceException異常AccessViolationException或例外, 具體取決於平台。
-
冒泡到托管代碼的非托管代碼中的訪問沖突始終包裝在AccessViolationException異常中。
在任一情況下, 都可以識別並更正AccessViolationException異常的原因, 如下所示:
確保您嘗試訪問的內存已分配。AccessViolationException異常始終由嘗試訪問受保護的內存 (即, 用於訪問未分配的內存或不屬於進程的內存) 引發。
自動內存管理是公共語言運行時提供的服務之一。 如果托管代碼與非托管代碼提供相同的功能, 你可能希望轉到托管代碼以利用此功能。 確保您嘗試訪問的內存未損壞。如果多次讀或寫操作時都遇到無效指針,則內存可能已損壞。 當讀取或寫入預定義緩沖區之外的地址時, 通常會發生這種情況。
HRESULT
AccessViolationException使用 E_POINTER 值為0x80004003的 HRESULT。