程序运行正常数小时,最终通过内存地址0x10出现 Seg 错误

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

本文关键字:地址 内存 0x10 出现 错误 Seg 运行 常数 小时 程序      更新时间:2023-10-16

所以我跟踪一些内存问题的时间最长。我正在用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 返回。

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

除此之外,如果在没有异常处理的情况下编译代码C++我经常看到它不希望从new调用中返回 NULL。这是因为通常失败的内存分配会引发异常,而不是返回值。

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