“free():无效的下一个符号(快速)”错误究竟意味着什么?

时间:2016-12-31 23:28:18

标签: c free

假设我有一个分配和释放内存的程序foo。我这样运行:

./foo something.foo

它完美无缺,退出时没有错误。现在,如果我将文件的第一行设置为#!/path/foo,更改权限,并将其作为./something.foo运行,程序运行正常,但在退出之前,我看到了:

*** Error in '/path/foo': free(): invalid next size(fast): 0x019e2008 ***
Aborted

我见过很多关于free(): invalid next sign(fast)的问题,所有问题都有特定的代码示例。所以我有两个问题:

  • 使用#!/path/foo代替./foo时,为什么会出现错误?
  • 错误究竟是什么意思 - 必须出现什么条件?

嗯,通过改变

来解决这个问题
some_var = malloc(sizeof(char *));

some_var = malloc(CONSTANT);

1 个答案:

答案 0 :(得分:6)

这意味着您的程序中存在堆损坏。该消息告诉您C库如何检测到损坏,而不是如何发生损坏。

堆损坏是一个特别隐蔽的错误追踪,因为它通常不会在错误发生时显现,而是在稍后的某个时刻。尽管存在损坏,程序仍然可以继续工作,这意味着它可能是您的代码中存在数周或数月的错误,与您正在测试和调试的最新更改无关。

对堆损坏的最佳响应通常是像valgrind这样的工具,它可以与您的程序一起运行,并且通常(但并不总是)能够确定违规代码的位置。