【问题标题】:Cannot access memory at address error地址错误时无法访问内存
【发布时间】:2011-04-01 23:12:43
【问题描述】:

我收到此错误:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000407265 in Quadtree::deeper (this=0x7fffffffe430, 
    orig=@0x7fffffffe430, n=@0x7a1da0, tol=Cannot access memory at address 0x7fffff3feffc
) at quadtree.cpp:47
47      int Quadtree::deeper(QuadtreeNode * & orig, QuadtreeNode * & n, int tol, int tolNum) {

这是第 47 行:

int Quadtree::deeper(QuadtreeNode * & orig, QuadtreeNode * & n, int tol, int tolNum) {

奇怪的是,我根本没有收到任何 valgrind 错误,而在运行时只有 gdb 错误和 seg 错误。一般来说,这个错误可能意味着什么(无需查看我的其余代码)?

【问题讨论】:

  • 如果没有更多信息,我怀疑任何人都可以帮助您。
  • 但是这个错误是什么意思?
  • @bitmoe:悬空指针或堆栈溢出,例如
  • 意味着你有一个错误的指针或对象引用......
  • 看起来你可能在某处传递了一个负数作为指针/引用

标签: c++


【解决方案1】:

我的最佳猜测:您看到堆栈溢出(真是巧合,鉴于我们所在的网站!:)。我无法解释为什么 Valgrind 没有捕捉到它:通常 Valgrind 使用与操作系统相同的堆栈大小(至少在我的系统上)。

这个错误的意思是你的代码试图访问地址0x7fffff3feffc的内存——读取或写入,但该地址当前没有内存映射到你的地址空间。执行此非法读取或写入的指令位于内存地址0x0000000000407265

如果编译器将函数左大括号的行号作为违规行,则它可能位于函数的序言中(将寄存器保存到堆栈的部分)。这就是为什么我怀疑你有堆栈溢出。

在 Linux 上,您可以查看 /proc/YOUR-PID/maps 以获取整个进程的内存映射。它将显示堆栈和堆的存储位置以及库的加载位置。您可以使用此信息来确定您可能溢出的内存部分。由于堆栈通常(在 Linux 上)位于内存的最顶端,因此您可能会发现这个非常大的地址非常靠近您的堆栈。

祝你好运!

【讨论】:

    【解决方案2】:

    检查orign 以及您调用deeperQuadtree 类型的对象都没有被释放(删除)。

    【讨论】:

      猜你喜欢
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 2018-09-08
      • 2013-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多