什么是AccessViolationException
试图读写受保护内存时引发的异常。
- 继承
说明
当非托管代码或不安全代码尝试对尚未分配的或不具有访问权限的内存进行读写操作时, 会发生访问冲突。 出现这种情况通常是因为指针具有错误的值。 并非所有通过无效指针的读或写操作都会导致访问冲突,所以访问冲突通常指示已经通过无效指针进行多次读或写操作,并且内存内容可能已损坏。 因此, 访问冲突几乎总是指示严重的编程错误。 AccessViolationException清楚地识别这些严重错误。
在完全由可验证托管代码组成的程序中, 所有引用要么有效要么为 null, 并且不可能访问冲突。 任何尝试在可验证代码中引用空引用的操作都会引发NullReferenceException异常。 仅AccessViolationException当可验证托管代码与非托管代码或不安全的托管代码进行交互时才会发生。
AccessViolationException异常只能出现在不安全的托管代码中, 或在可验证托管代码与非托管代码交互时出现:
-
在不安全的托管代码中发生的访问冲突可以表示为NullReferenceException异常AccessViolationException或例外, 具体取决于平台。
-
冒泡到托管代码的非托管代码中的访问冲突始终包装在AccessViolationException异常中。
在任一情况下, 都可以识别并更正AccessViolationException异常的原因, 如下所示:
确保您尝试访问的内存已分配。AccessViolationException异常始终由尝试访问受保护的内存 (即, 用于访问未分配的内存或不属于进程的内存) 引发。
自动内存管理是公共语言运行时提供的服务之一。 如果托管代码与非托管代码提供相同的功能, 你可能希望转到托管代码以利用此功能。 确保您尝试访问的内存未损坏。如果多次读或写操作时都遇到无效指针,则内存可能已损坏。 当读取或写入预定义缓冲区之外的地址时, 通常会发生这种情况。
HRESULT
AccessViolationException使用 E_POINTER 值为0x80004003的 HRESULT。