程序可以正常运行数小时,最终出现内存地址为 0x10 的段错误

Program Runs Fine for Hours and Eventually Seg Faults with Memory Address 0x10

所以我一直在跟踪一些内存问题。我正在用 C++ 编码,我可以看到我的程序大部分都能正常工作。我正在监视我的资源,我认为我没有内存泄漏,因为我的内存使用率保持在 12% 以下(我在一个具有 256MB 内存的系统上)。我可以让这个东西 运行 几个小时,它可以工作,但最终会出现段错误。

很难分析这个问题,因为一个问题真正出现需要很长时间。 运行整天在调试器中调试它后它就崩溃了,我可以看到我正在做一些工作来确定什么应该是有效的指针地址。

  sprintf(asciihex, "%x", var[c] & MASK);  //Where var is a pointer
                                           //MASK is 0xff

我知道这是可行的,因为我的程序 运行 具有几个小时的有效信息,但是当程序崩溃时,我的 var 不是一个有效的指针 (0xbb6b03408),内存地址为(0x10).

其他变量(它是结构的一部分)实际上也为 NULL。所以我想弄清楚这里发生了什么。我的代码检查了 NULL 指针并跳过了它们,但 0x10 不被视为 NULL,因此它中断了。我已经看到其他值,如 0x15 和 0x18,所以我不想只为它们添加更多检查,我想找到根本原因。

有什么建议就太好了!

我预测你的结构是通过 newmalloc 动态分配的,有人正在吃 std::bad_alloc 异常而不处理它或忽略 NULL return .

地址 0x10 几乎肯定是 NULL 加上结构成员偏移量。这也可以解释归零字段,因为大多数操作系统将虚拟零页映射到 NULL。

此外,如果代码是在没有 C++ 异常处理的情况下编译的,我经常看到它不期望来自 new 调用的 NULL returns。那是因为通常失败的内存分配会抛出异常而不是 returning 一个值。

您不能只关闭编译器中的异常处理而不修复代码。