c++ - 程序运行良好数小时,最终出现内存地址 0x10 的段错误

标签 c++ c memory arm

所以我很长时间以来一直在跟踪一些内存问题。我正在使用 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。这是因为通常失败的内存分配会抛出异常而不是返回值。

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

关于c++ - 程序运行良好数小时,最终出现内存地址 0x10 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30854102/

相关文章:

c++ - 为什么我的数组只接受它们中的第一个数字?

c++ - 在 C++ 中 mutable 可以做什么?

c - 如何迭代字符串的组合

c - 使用txt文件将值输入到指针数组中

objective-c - 为什么 Activity Monitor 和 Allocations Instrument 报告的应用程序内存使用情况存在差异

c++ - 在内存使用或编译时间方面哪个更好?

c++ - VC++ Variadic-Template-Template 错误 C2244 : unable to match function definition to an existing declaration

c++ - 为什么 Createfile() 没有二进制标志

c - 按值或引用将数组传递给函数是否相同?

c++ - 免费/删除 - 如果我不调用他们怎么办