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

标签 c++ memory-management access-violation memcpy crash-dumps

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

转储的总大小为 32.374.535 kb。

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

Visual Studio Locals 窗口是空的。

未处理的异常提到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  ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??  ..............................................................

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

有人对此有想法吗?

最佳答案

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

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

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

关于c++ - 访问冲突可以是伪装的内存不足错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54213917/

相关文章:

C++ 只在 char* 中存储 double 的特定字节

c++ - 如何同步两个程序的定时器

.net - Bonjour sdk for windows 仅在 UI 线程中运行

MySql 访问冲突或语法错误

c++ - 访问冲突 : 0xC0000005, 为什么会发生这种情况?

c++ - 在cocos2dx中听不到音效

c++ - 通过指针遍历数组

c - 虚拟环境内存泄漏怎么办?

c - EXC_BAD_ACCESS : too much memory allocated?

c - 在 C 中取消分配结构的动态链表