访问冲突可以是伪装的内存不足错误吗?

Can an access violation be a disguised out-of-memory error?

我正在调试 64 位 C++(托管)故障转储(访问冲突)。

转储的总大小为 32.374.535 kb。

应用是多线程的,对应的调用栈只提到mscvrt.dll!memcpy(不知道是哪个线程在创建这个)。显然没有对应的源码。

Visual StudioLocalswindow为空

未处理的异常提到Access violation writing location 0x000000F02A6BB000,但在那个位置,似乎什么都没有:

0x000000F02A6BAF84  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ..............................................................
0x000000F02A6BAFC2  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ..............................................................
0x000000F02A6BB000  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??  .............................................................. <= here it is.
0x000000F02A6BB03E  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??  ..............................................................

我看不出为什么在这个内存位置上写入会导致任何问题,因此我相信(根据转储的大小)我正在处理内存错误(这意味着它不可能将某些内容复制到内存中,因为已经使用了太多内存,以至于没有剩余空间)。但是,如果这是真的,那么该内存位置不应该有一些信息吗?

有人对此有想法吗?

如果不查看源代码,就无法知道如果遇到内存不足错误它会做什么。肯定有很多程序不会检查每个内存分配是否失败,因此它们的代码可能会完全偏离 rails。

未经检查的内存不足错误的最常见结果是访问冲突,但它通常位于非常小的地址或其中有一些明显的荒谬模式。这是因为许多内存分配函数 return 在内存不足时为零,并且检查失败可能导致访问接近 returned 值的地址。此外,某些函数会保留未初始化的结果和 return 一个单独的错误。未能检查该错误可能会导致使用未初始化的值访问内存,这通常看起来很奇怪。

在这里,地址看起来很合理。但谁知道呢。也许代码分配了一个新缓冲区,释放旧缓冲区,并将旧地址切换为新缓冲区,但在出错时,不会切换地址但会释放旧地址,导致释放后访问。没有源码就不知道了

正如 Scheff 和 Peter 的评论中所述,访问冲突实际上可能是内存不足错误(或其他类型的内存相关错误)。

在这种特殊情况下,较大的转储 (±33Gb) 表明该应用程序(连同其他应用程序)可能消耗过多内存。

直觉上,在我看来这不像是内存不足错误。某些设计不良的操作系统上的内存分配系统服务在分配内存失败时会 return 成功赋值。尽管 Windoze 有很多缺陷,但我不相信它是这样一个系统。如果您 运行 在一个确实进行某种延迟分配的系统上,那么我会怀疑您所怀疑的。

Methinks,您遇到内存溢出,导致写入尚未映射到地址 space 的页面。