假设我有一个分配和释放内存的程序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);
答案 0 :(得分:6)
这意味着您的程序中存在堆损坏。该消息告诉您C库如何检测到损坏,而不是如何发生损坏。
堆损坏是一个特别隐蔽的错误追踪,因为它通常不会在错误发生时显现,而是在稍后的某个时刻。尽管存在损坏,程序仍然可以继续工作,这意味着它可能是您的代码中存在数周或数月的错误,与您正在测试和调试的最新更改无关。
对堆损坏的最佳响应通常是像valgrind这样的工具,它可以与您的程序一起运行,并且通常(但并不总是)能够确定违规代码的位置。