【问题标题】:What does "ar_ptr = arena_for_chunk(p);" mean?“ar_ptr = arena_for_chunk(p);”是什么意思?意思是?
【发布时间】:2013-03-10 20:18:41
【问题描述】:

我正在通过 gdb 运行一个程序。它运行“free(buffer);”行然后我收到这条消息: 程序收到信号SIGSEGV,Segmentation fault。

 0xb7e97103 in __GI___libc_free (mem=0xbffff11e) at malloc.c:2987
 2987     ar_ptr = arena_for_chunk(p);

程序的下一行是“fclose(inptr);”我该如何着手解决这个问题?

【问题讨论】:

  • 这两个答案对您有帮助吗?如果是这样,接受一个(点击勾号)并投票(点击向上的三角形)将是建设性的。如果他们都提供了帮助,请对两者都投赞成票并勾选最有用的一项。如果两者都没有帮助,请解释原因,我相信您会得到更多帮助...

标签: c


【解决方案1】:

您的变量buffer 要么为空,要么指向无法释放(或已被释放)的内存。

【讨论】:

  • C 标准说:free 函数使ptr 指向的空间被释放,也就是说,可用于进一步分配。如果ptr 是空指针,则不执行任何操作。
【解决方案2】:

您的问题的实际答案是ar_ptr = arena_for_chunk(p); 是一个内部数据结构,用于确定应将内存释放到何处。但是,如果你愿意,你可以继续在那里挖掘,直到你找到为什么 p 几乎可以肯定是你传入的 buffer 或者与它密切相关的一些值是“不正确的” - 但这有点像寻找你掉在路灯下的钥匙,因为你可以在那里看得更清楚,而不是试图找到你把它们掉在哪里。

当标准库中的代码崩溃时,尤其是每次运行任何琐碎程序时都会调用的代码,那么 99.9% 的时间是由“错误输入”引起的 - 去查看调用函数的代码,而不是内部函数(尽管有必要回顾一下哪里出了问题,以确定是哪个输入参数导致了问题)。

实际问题是您的代码使用错误参数调用 free(),这使得 arena_for_chunk 做错了 - 鉴于上面一行中的值 mem = 0xbffff11e,我希望 buffer 是实际上是堆栈上的一个值,不应该被释放。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多