程序运行正常数小时,最终通过内存地址0x10出现 Seg 错误
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,所以我不想只是为这些值添加更多检查,我想找到根本原因。
任何建议都会很棒!
我预测您的结构是通过new
或malloc
动态分配的,并且有人要么吃std::bad_alloc
异常而不处理它,要么忽略 NULL 返回。
地址 0x10 几乎肯定是 NULL 加上结构成员偏移量。这也可以解释清零字段,因为大多数操作系统在 NULL 处映射虚拟零页。
除此之外,如果在没有异常处理的情况下编译代码C++我经常看到它不希望从new
调用中返回 NULL。这是因为通常失败的内存分配会引发异常,而不是返回值。
您不能只关闭编译器中的异常处理而不修复代码。
相关文章:
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- CUDA:统一内存和指针地址的更改
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 使用内存地址访问结构的属性值
- 如何读取特定地址的进程内存?
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 将布局映射到内存地址
- 为什么同一个变量的内存地址不同?
- LLVM 传递以在特定地址分配内存
- 无法将内存地址转换为值
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 给定特定内存地址的数组的动态内存分配
- 在 Microsoft Access SQL 中调用自定义 DLL 函数时传递的内存地址无效
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 获取 R 数据帧的内存地址
- 如何配置bazel以运行地址/内存清理器?
- 存储 std::list 元素的地址;内存
- 确定库的地址内存