所以我很长时间以来一直在跟踪一些内存问题。我正在使用 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,所以我不想只为这些值添加更多检查,我想找到根本原因。
任何建议都会很棒!
最佳答案
我预测您的结构正在通过 new
或 malloc
动态分配,并且有人正在吃 std::bad_alloc
异常而不处理它或忽略 NULL 返回。
地址 0x10 几乎肯定是 NULL 加上结构成员偏移量。这也可以解释归零字段,因为大多数操作系统将虚拟零页映射为 NULL。
除此之外,如果代码在没有 C++ 异常处理的情况下编译,我经常看到它不希望从 new
调用中返回 NULL。这是因为通常失败的内存分配会抛出异常而不是返回值。
您不能只关闭编译器中的异常处理而不修复代码。
关于c++ - 程序运行良好数小时,最终出现内存地址 0x10 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30854102/