加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 地址错误时无法访问内存

发布时间:2020-12-16 04:52:29 所属栏目:百科 来源:网络整理
导读:我收到这个错误: 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:4747 int Q
我收到这个错误:
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,int tolNum) {

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

解决方法

我最好的猜测:你看到一个堆栈溢出(真是巧合,考虑到我们所在的网站!:).我无法解释为什么Valgrind没有抓住它:通常Valgrind使用与操作系统相同的堆栈大小(至少在我的系统上).

此错误意味着您的代码尝试访问地址0x7fffff3feffc处的内存 – 读取或写入,但该地址当前未存储器映射到您的地址空间.执行此非法读取或写入的指令位于存储器地址0x0000000000407265.

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

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

祝好运!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读