本文提供了此 API 参考文档的补充说明。
当代码尝试读取或写入尚未分配的内存或无权访问的内存时,访问冲突发生在非托管或不安全的代码中。 这通常是因为指针具有错误的值。 并非所有通过错误的指针进行读取或写入都会导致访问冲突,因此访问冲突通常表示多个读取或写入是通过错误的指针发生的,并且内存可能已损坏。 因此,访问违规几乎总是表明严重的编程错误。 AccessViolationException 明确标识这些严重错误。
在完全由可验证托管代码组成的程序中,所有引用要么有效,要么为空,并且无法发生访问冲突。 在可验证代码中,任何尝试引用空引用的操作都会引发 NullReferenceException 异常。 AccessViolationException仅当可验证的托管代码与非托管代码或不安全的托管代码交互时,才会发生此情况。
AccessViolationException 异常疑难解答
AccessViolationException异常只能在不安全的托管代码中发生,或者当可验证的托管代码与非托管代码交互时:
- 不安全托管代码中发生的访问冲突可以表示为 NullReferenceException 异常或 AccessViolationException 异常,具体取决于平台。
- 非托管代码中的访问冲突在弹回到托管代码时,总是被包装在一个AccessViolationException异常中。
在任一情况下,都可以识别并更正异常的原因 AccessViolationException ,如下所示:
确保您尝试访问的内存已被分配。 AccessViolationException尝试访问受保护内存(即访问未分配或进程不拥有的内存)始终引发异常。
自动内存管理是 .NET 运行时提供的服务之一。 如果托管代码提供与非托管代码相同的功能,请考虑迁移到托管代码以利用此功能。 有关详细信息,请参阅 自动内存管理。
确保尝试访问的内存尚未损坏。 如果通过错误的指针执行了多个读取或写入作,则内存可能会损坏。 在预定义缓冲区之外读取或写入地址时,通常会发生这种情况。
AccessViolationException 和 try/catch 块
AccessViolationException 如果异常发生在运行时保留的内存之外,则 .NET 运行时引发的异常不会由 catch
结构化异常处理程序中的语句处理。
仅限 .NET Framework:若要处理此类 AccessViolationException 异常,请将 HandleProcessCorruptedStateExceptionsAttribute 属性应用于引发异常的方法。 此更改不会影响 AccessViolationException 用户代码引发的异常,该异常可以继续由 catch
语句捕获。
谨慎
HandleProcessCorruptedStateExceptions 属性在当前 .NET 版本中已过时。 不支持从损坏的进程状态异常恢复,如果存在该属性,将被忽略。