我收到了这个错误:
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错误。这个错误在一般意义上可能意味着什么(无需查看我的其余代码)?
答案 0 :(得分:13)
我最好的猜测:你看到一个堆栈溢出(真是巧合,考虑到我们正在使用的网站!:)。我无法解释为什么Valgrind没有抓住它:通常Valgrind使用与操作系统相同的堆栈大小(至少在我的系统上)。
此错误意味着您的代码尝试访问地址0x7fffff3feffc
的内存 - 读取或写入,但该地址当前未内存映射到您的地址空间。执行此非法读取或写入的指令位于存储器地址0x0000000000407265
。
如果编译器为您提供函数的大括号的行号作为违规行,则它可能位于函数的序言中(将寄存器保存到堆栈的部分)。这就是我怀疑你有堆栈溢出的原因。
在Linux上,您可以查看/proc/YOUR-PID/maps
以获取整个过程的内存映射。它将显示存储堆栈和堆的位置,以及库的加载位置。您可以使用此信息来确定您可能溢出的内存部分。由于堆栈通常(在Linux上)位于内存的最顶层,因此您可能会发现这个非常大的地址非常靠近堆栈。
答案 1 :(得分:0)
检查orig
和n
以及您正在调用Quadtree
的{{1}}类型的对象是否已被释放(已删除)。