我正在通过gdb运行程序。它运行“free(buffer);”然后我收到这条消息: 程序接收信号SIGSEGV,分段故障。
0xb7e97103 in __GI___libc_free (mem=0xbffff11e) at malloc.c:2987
2987 ar_ptr = arena_for_chunk(p);
该计划的下一行是“fclose(inptr);”我该如何开始解决这个问题?
答案 0 :(得分:1)
您的变量buffer
为null或指向无法释放(或已被释放)的内存。
答案 1 :(得分:1)
您问题的实际答案是ar_ptr = arena_for_chunk(p);
是一个内部数据结构,用于确定应释放内存的位置。但是,你可以继续挖掘,如果你愿意,直到你找到为什么p
几乎肯定是你传入的buffer
或者与它密切相关的某些值是“不正确” - 但这将是一个有点像在街灯下找你丢失的钥匙,因为你可以在那里看得更清楚,而不是试图找到你丢弃它们的地方。
当标准库中的代码崩溃时,特别是每次运行任何普通程序时调用的代码,那么99.9%的时间是由“输入错误”引起的 - 去查看调用函数的代码,而不是在功能(虽然值得回顾一下出错导致问题导致哪个输入参数出错)。
实际问题是您的代码使用错误的参数调用free()
,这会导致arena_for_chunk
做错了 - 假设上面一行中的值mem = 0xbffff11e
,我期望buffer
实际上是堆栈上的值,不应该被释放。